当前位置:嗨网首页>书籍在线阅读

14-实例主窗口设计与初始化

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

15.5.2 实例主窗口设计与初始化

实例samp15_7的主窗口是基于QMainWindow的类MainWindow,界面由UI设计器设计。在窗口左侧“摄像头预览”框里放置一个QWidget组件,并提升为QCameraViewfinder,这是从QVideoWidget继承的类,专门用于摄像头预览显示。在窗口右侧“抓取图片”框里放置一个QLabel组件,用于显示抓取的图片。

窗口的工具栏按钮由Action生成,设计的Action列表如图15-8所示。

249.png

图15-8 实例samp15_7设计的Action

主窗口类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个初始化函数进行初始化,然后打开摄像头。