Qt Camera 摄像头程序代码注释
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
}
原文地址: https://www.cveoy.top/t/topic/oRca 著作权归作者所有。请勿转载和采集!