文章目錄
- 前言
- 一、相機里面的主要功能介紹
- 二、代碼實作
- 1.工程目錄結構
- 2.各檔案代碼:
- 總結
前言
今天我們來使用Qt寫一個相機小程式,
一、相機里面的主要功能介紹

- 這張是一開始運行的界面,有一個視窗顯示攝像頭捕捉的畫面,還有兩個按鈕控制元件,其實左下角還有一個label控制元件(下張圖片可見具體位置),
- 當我們開始點擊拍照按鈕,此時就會使用label控制元件來顯示一個小的照片,具體如下:

- 左下角顯示的照片就是使用label控制元件來承載的,這時我們再使用滑鼠點擊label控制元件(即左下角的小圖片), 這是會創建一個新的視窗, 顯示我們剛剛拍的照片,具體如下:

- 第3步的時候我們點擊保存按鈕的話就會彈出一個保存檔案的視窗,具體如下:

- 就是以上的幾點小功能了
二、代碼實作
1.工程目錄結構

clicklabel.h和clicklabel.cpp:
這兩個檔案主要實作了label的點擊功能,類似于使label也有按鈕的功能,
mainwindow.h:
這里面主要定義了許多變數,方便實作信號與槽的功能,
mainwindow.cpp:
這里面主要實作了呼叫攝像頭,顯示畫面,拍照,保存照片等功能,具體大家可以參考下面代碼,
mainwindow.ui
這里面主要是界面布局,
2.各檔案代碼:
clicklabel.h:
#ifndef CLICKLABEL_H
#define CLICKLABEL_H
#include <QWidget>
#include <QLabel>
#include <QDebug>
#include <QMouseEvent>
class ClickLabel : public QLabel
{
Q_OBJECT
public:
ClickLabel(QWidget * parent = 0) : QLabel(parent){}
~ClickLabel(){}
public:
signals:
void clicked1(ClickLabel * click);
protected:
void mousePressEvent(QMouseEvent *e);
};
#endif // CLICKLABEL_H
clicklabel.cpp:
#include "clicklabel.h"
void ClickLabel::mousePressEvent(QMouseEvent *)
{
emit clicked1(this); //發送自定義信號
}
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QImage>
#include <QLabel>
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QString fileName;
QImage image;
QWidget * parent;
char newFlag;
QLabel * label;
private slots:
void displayImage(int, QImage);
void on_capture_clicked();
void on_pushButton_clicked();
void showPhoto();
private:
Ui::MainWindow *ui;
QCameraImageCapture * imageCapture;
QCameraViewfinder * viewfinder;
QCamera * myCamera;
};
#endif // MAINWINDOW_H
mainwindow.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "clicklabel.h"
#include <QFileDialog> //檔案對話框
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
newFlag = 1;
this->parent = parent;
myCamera = new QCamera(this); //創建相機物件
viewfinder = new QCameraViewfinder(this); //創建一個取景器
imageCapture = new QCameraImageCapture(myCamera, this); //創建圖片捕獲物件
myCamera->setViewfinder(viewfinder); //系結相機和取景器
ui->ImageView->addWidget(viewfinder);
myCamera->start();
connect(imageCapture, SIGNAL(imageCaptured(int, QImage)), this, SLOT(displayImage(int, QImage)));
connect(ui->PhotoShow, SIGNAL(clicked1(ClickLabel *)), this, SLOT(showPhoto()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::displayImage(int, QImage image)
{
ui->PhotoShow->setPixmap(QPixmap::fromImage(image)); //使用label控制元件來承載照片
this->image = image;
}
void MainWindow::on_capture_clicked() //拍照按鈕
{
imageCapture->capture(); //開始拍照(檔案默認保存在圖片)
}
void MainWindow::showPhoto() //開新視窗顯示拍的照片
{
if(1 == newFlag) //此條件保證多次點擊label控制元件也只會創建一個視窗
{
MainWindow * wShow = new MainWindow(parent);
wShow->setFixedSize(800, 480);
wShow->show(); //設定一個新視窗顯示拍好的照片
label = new QLabel(wShow);
}
label->setFixedSize(800, 480);
label->show();
label->setPixmap(QPixmap::fromImage(image));
newFlag = 0;
}
void MainWindow::on_pushButton_clicked()
{
//使用檔案對話框保存圖片
fileName = QFileDialog::getSaveFileName(this, "save file", QDir::homePath(), "*.jpg; *.*");
if(fileName.isEmpty())
{
return;
}
//qDebug() << fileName;
}
main.cpp:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
總結
以上就是今天的小程式了,代碼寫的不是很優美,如果大家有什么效率更高的方法,可以指出來,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/180255.html
標籤:其他
上一篇:中綴運算式轉后綴運算式一圖秒殺
