Camera::Camera(QWidget *parent) : // Camera类的构造函数,接受一个QWidget类型的父窗口指针 QMainWindow(parent), // 调用QMainWindow的构造函数,将父窗口指针传递给它 ui(new Ui::Camera), // 创建一个新的Ui::Camera对象,用于管理Camera类的用户界面 camera(0), // 初始化camera指针为0 imageCapture(0), // 初始化imageCapture指针为0 mediaRecorder(0), // 初始化mediaRecorder指针为0 isCapturingImage(false), // 初始化isCapturingImage为false applicationExiting(false) // 初始化applicationExiting为false { ui->setupUi(this); // 创建Camera类的用户界面,该界面由Qt Designer生成,并在此处加载

// Camera devices:

QActionGroup *videoDevicesGroup = new QActionGroup(this);  // 创建一个QActionGroup对象,用于管理摄像头设备的QAction
videoDevicesGroup->setExclusive(true);                     // 设置该QActionGroup是互斥的,即同时只能有一个QAction被选中

// 遍历检测到的摄像头
foreach (const QCameraInfo &cameraInfo, QCameraInfo::availableCameras()) {
    QAction *videoDeviceAction = new QAction(cameraInfo.description(), videoDevicesGroup);   // 为每个检测到的摄像头创建一个QAction
    videoDeviceAction->setCheckable(true);                                                   // 将该QAction设置为可选中
    videoDeviceAction->setData(QVariant::fromValue(cameraInfo));                              // 将该QAction的数据设置为该摄像头的QCameraInfo对象
    if (cameraInfo == QCameraInfo::defaultCamera())
        videoDeviceAction->setChecked(true);                                                 // 如果该摄像头是默认摄像头,则将该QAction设置为选中状态

    ui->menuDevices->addAction(videoDeviceAction);                                            // 将该QAction添加到菜单栏中
}

connect(videoDevicesGroup, SIGNAL(triggered(QAction*)), SLOT(updateCameraDevice(QAction*)));  // 将QActionGroup的triggered信号与updateCameraDevice槽连接
connect(ui->captureWidget, SIGNAL(currentChanged(int)), SLOT(updateCaptureMode()));           // 将ui->captureWidget的currentChanged信号与updateCaptureMode槽连接

setCamera(QCameraInfo::defaultCamera());                                                      // 设置默认摄像头

}

Camera::~Camera() // Camera类的析构函数 { delete mediaRecorder; // 释放mediaRecorder指针指向的内存 delete imageCapture; // 释放imageCapture指针指向的内存 delete camera; // 释放camera指针指向的内存 }

void Camera::setCamera(const QCameraInfo &cameraInfo) // 设置摄像头 { delete imageCapture; // 释放imageCapture指针指向的内存 delete mediaRecorder; // 释放mediaRecorder指针指向的内存 delete camera; // 释放camera指针指向的内存

camera = new QCamera(cameraInfo); // 创建一个新的QCamera对象,传递给它指定的QCameraInfo对象

connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(updateCameraState(QCamera::State)));  // 将QCamera的stateChanged信号与updateCameraState槽连接
connect(camera, SIGNAL(error(QCamera::Error)), this, SLOT(displayCameraError()));                      // 将QCamera的error信号与displayCameraError槽连接

mediaRecorder = new QMediaRecorder(camera);    // 创建一个新的QMediaRecorder对象,传递给它指定的QCamera对象
connect(mediaRecorder, SIGNAL(stateChanged(QMediaRecorder::State)), this, SLOT(updateRecorderState(QMediaRecorder::State)));  // 将QMediaRecorder的stateChanged信号与updateRecorderState槽连接   

imageCapture = new QCameraImageCapture(camera); // 创建一个新的QCameraImageCapture对象,传递给它指定的QCamera对象

connect(mediaRecorder, SIGNAL(durationChanged(qint64)), this, SLOT(updateRecordTime()));    // 将QMediaRecorder的durationChanged信号与updateRecordTime槽连接
connect(mediaRecorder, SIGNAL(error(QMediaRecorder::Error)), this, SLOT(displayRecorderError()));  // 将QMediaRecorder的error信号与displayRecorderError槽连接

mediaRecorder->setMetaData(QMediaMetaData::Title, QVariant(QLatin1String('Test Title')));    // 设置QMediaRecorder的元数据

connect(ui->exposureCompensation, SIGNAL(valueChanged(int)), SLOT(setExposureCompensation(int)));  // 将ui->exposureCompensation的valueChanged信号与setExposureCompensation槽连接

camera->setViewfinder(ui->rviewfinde);   // 将QCamera的取景器设置为ui->rviewfinde

updateCameraState(camera->state());      // 更新QCamera的状态
updateLockStatus(camera->lockStatus(), QCamera::UserRequest);  // 更新QCamera的锁定状态
updateRecorderState(mediaRecorder->state());  // 更新QMediaRecorder的状态

connect(imageCapture, SIGNAL(readyForCaptureChanged(bool)), this, SLOT(readyForCapture(bool)));   // 将QCameraImageCapture的readyForCaptureChanged信号与readyForCapture槽连接
connect(imageCapture, SIGNAL(imageCaptured(int,QImage)), this, SLOT(processCapturedImage(int,QImage)));  // 将QCameraImageCapture的imageCaptured信号与processCapturedImage槽连接
connect(imageCapture, SIGNAL(imageSaved(int,QString)), this, SLOT(imageSaved(int,QString)));      // 将QCameraImageCapture的imageSaved信号与imageSaved槽连接
connect(imageCapture, SIGNAL(error(int,QCameraImageCapture::Error,QString)), this,
        SLOT(displayCaptureError(int,QCameraImageCapture::Error,QString)));   // 将QCameraImageCapture的error信号与displayCaptureError槽连接

connect(camera, SIGNAL(lockStatusChanged(QCamera::LockStatus,QCamera::LockChangeReason)),
        this, SLOT(updateLockStatus(QCamera::LockStatus,QCamera::LockChangeReason)));  // 将QCamera的lockStatusChanged信号与updateLockStatus槽连接

ui->captureWidget->setTabEnabled(0, (camera->isCaptureModeSupported(QCamera::CaptureStillImage)));  // 设置第一个选项卡是否可用,取决于QCamera是否支持静态图像捕获
ui->captureWidget->setTabEnabled(1, (camera->isCaptureModeSupported(QCamera::CaptureVideo)));      // 设置第二个选项卡是否可用,取决于QCamera是否支持视频捕获

updateCaptureMode();  // 更新捕获模式
camera->start();      // 启动QCamera

}

Qt Camera 摄像头程序代码注释

原文地址: https://www.cveoy.top/t/topic/oRca 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录