14-实例主窗口设计与初始化
15.5.2 实例主窗口设计与初始化
实例samp15_7的主窗口是基于QMainWindow的类MainWindow,界面由UI设计器设计。在窗口左侧“摄像头预览”框里放置一个QWidget组件,并提升为QCameraViewfinder,这是从QVideoWidget继承的类,专门用于摄像头预览显示。在窗口右侧“抓取图片”框里放置一个QLabel组件,用于显示抓取的图片。
窗口的工具栏按钮由Action生成,设计的Action列表如图15-8所示。

主窗口类MainWindow的定义如下(省略了自动生成的界面组件的槽函数定义):
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QCamera *curCamera=Q_NULLPTR;
QCameraImageCapture *imageCapture; //抓图
QMediaRecorder * mediaRecorder;//录像
QLabel *LabCameraState;
QLabel *LabInfo;
QLabel *LabCameraMode;
void iniCamera();//初始化
void iniImageCapture();//初始化静态抓图
void iniVideoRecorder();//初始化视频录制
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
//QCamera的槽函数
void on_cameraStateChanged(QCamera::State state);
void on_cameraCaptureModeChanged(QCamera::CaptureModes mode);
//QCameraImageCapture的槽函数
void on_imageReadyForCapture(bool ready);
void on_imageCaptured(int id, const QImage &preview);
void on_imageSaved(int id, const QString &fileName);
// QMediaRecorder的槽函数
void on_videoStateChanged(QMediaRecorder::State state);
void on_videoDurationChanged(qint64 duration);
private:
Ui::MainWindow *ui;
};
这里定义了QCamera、QCameraImageCapture和QmediaRecorder 3个类型的私有变量。定义了3个私有函数,分别用于3个对象的创建和初始化。
定义了多个槽函数,分别与3个对象的相应信号关联。
下面是MainWindow的构造函数的代码:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
LabCameraState=new QLabel("摄像头state: ");
LabCameraState->setMinimumWidth(150);
ui->statusBar->addWidget(LabCameraState);
LabCameraMode=new QLabel("抓取模式: ");
LabCameraMode->setMinimumWidth(150);
ui->statusBar->addWidget(LabCameraMode);
LabInfo=new QLabel("");
ui->statusBar->addPermanentWidget(LabInfo);
QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
if (cameras.size()>0)
{
iniCamera(); //初始化摄像头
iniImageCapture();//初始化静态抓图
iniVideoRecorder();//初始化视频录制
curCamera->start();
}
}
构造函数首先要创建状态栏上显示信息的标签,然后使用QCameraInfo的静态函数available Cameras()获取摄像头列表cameras,如果存在摄像头设备,就依次调用3个初始化函数进行初始化,然后打开摄像头。