#include "cameramainwindow.h" #include "ui_cameramainwindow.h" CameraMainWindow::CameraMainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::CameraMainWindow) { 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); QListcameras = QCameraInfo::availableCameras() ; if (cameras.size()>0) { iniCamera(); // 初始化摄像头 iniImageCapture();//初始化静态画图 iniVideoRecorder() ;//初始化视频录制 curCamera->start() ; } } CameraMainWindow::~CameraMainWindow() { delete ui; } void CameraMainWindow::iniCamera() { QCameraInfo curCameraInfo=QCameraInfo::defaultCamera(); //获取缺省摄像头 ui-> comboCamera->addItem( curCameraInfo. description());//摄像头描述 ui->comboCamera->setCurrentIndex(0) ; curCamera=new QCamera(curCameraInfo, this); //创建摄像头对象 QCameraViewfinderSettings viewfinderSettings; viewfinderSettings.setResolution(640,480) ; curCamera->setViewfinderSettings (viewfinderSettings) ; curCamera->setViewfinder(ui->widget); curCamera->setCaptureMode(QCamera::CaptureStillImage); ui->pushButton_5->setChecked(curCamera->isCaptureModeSupported(QCamera::CaptureVideo)); ui->pushButton_2->setChecked(curCamera->isCaptureModeSupported(QCamera::CaptureStillImage)); connect(curCamera,SIGNAL(stateChanged(QCamera::State)),this,SLOT(on_stateChanged(QCamera::State))); connect(curCamera,SIGNAL(captureModeChanged(QCamera::CaptureModes)),this,SLOT(on_captureModeChanged(QCamera::CaptureModes))); } void CameraMainWindow::iniImageCapture() { imageCapture=new QCameraImageCapture(curCamera,this); imageCapture->setBufferFormat(QVideoframe::Format_Jpeg); imageCapture->setCaptureDestination(QCameraImageCapture::CaptureToFile); connect (imageCapture, SIGNAL (readyForCaptureChanged(bool)), this, SLOT(on_imageReadyForCapture(bool))); connect(imageCapture,SIGNAL (imageCaptured(int, const QImage &)) , this,SLOT(on_imageCaptured(int, const QImage &))); connect(imageCapture,SIGNAL(imageSaved(int,const QString &)) , this,SLOT(on_imageSaved(int,const QString &))); } void CameraMainWindow::iniVideoRecorder() { mediaRecorder=new QMediaRecorder(curCamera,this); connect(mediaRecorder,SIGNAL(stateChanged(QMediaRecorder::State)),this,SLOT(on_camerastateChanged(QMediaRecorder::State))); connect(mediaRecorder,SIGNAL(durationChanged(qint64)),this,SLOT(on_cameradurationChanged(qint64))); } void CameraMainWindow::on_stateChanged(QCamera::State state) { switch (state) { case QCamera::UnloadedState: LabCameraState->setText("摄像头state: UnloadedState"); break; case QCamera::LoadedState: LabCameraState->setText("摄像头state: LoadedState") ; break; case QCamera::ActiveState: LabCameraState->setText("摄像头state: ActiveState"); } ui->pushButton_3->setEnabled(state!=QCamera::ActiveState) ; ui->pushButton_4->setEnabled(state==QCamera::ActiveState) ; } void CameraMainWindow::on_captureModeChanged(QCamera::CaptureModes mode) { if (mode==QCamera::CaptureStillImage) LabCameraMode->setText("抓取模式: StillImage"); else if (mode==QCamera::CaptureVideo) LabCameraMode->setText("抓取模式: Video"); else LabCameraMode->setText("抓取模式:Viewfinder"); } void CameraMainWindow::on_cameradurationChanged(qint64) { } void CameraMainWindow::on_camerastateChanged(QMediaRecorder::State state) { ui->pushButton_5->setEnabled(state!=QMediaRecorder::RecordingState); ui->pushButton_6->setEnabled(state==QMediaRecorder::RecordingState); } void CameraMainWindow::on_imageReadyForCapture(bool ready) { ui->pushButton_2->setEnabled(ready); } void CameraMainWindow::on_imageCaptured(int id, const QImage &preview) { Q_UNUSED(id) ; QImage scaledImage=preview.scaled(ui->LabCapturedImage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation) ; ui ->LabCapturedImage->setPixmap(QPixmap::fromImage(scaledImage)); } void CameraMainWindow::on_imageSaved(int id, const QString &fileName) { LabInfo->setText("图片保存为:"+fileName); } void CameraMainWindow::on_pushButton_2_clicked() { if (curCamera->captureMode()!=QCamera::CaptureStillImage) { curCamera->setCaptureMode(QCamera::CaptureStillImage); } imageCapture->capture(); } void CameraMainWindow::on_pushButton_3_clicked() { curCamera->start(); } void CameraMainWindow::on_pushButton_4_clicked() { curCamera->stop(); } #include #include #include #include //录制视频 void CameraMainWindow::on_pushButton_5_clicked() { if(!mediaRecorder->isAvailable()) { QMessageBox::information(this,"提示","不支持录屏",QMessageBox::Ok); return; } if(curCamera->captureMode()!=QCamera::CaptureVideo) { curCamera->setCaptureMode(QCamera::CaptureVideo); } QString selectedFile=ui->lineEdit->text(); if(selectedFile.isEmpty()) return; if(QFile::exists(selectedFile)) { if(!QFile::remove(selectedFile)) { QMessageBox::information(this,"提示","文件被占用",QMessageBox::Ok); return; } } mediaRecorder->setOutputLocation(QUrl::fromLocalFile(selectedFile)); mediaRecorder->record(); } //停止录像 void CameraMainWindow::on_pushButton_6_clicked() { mediaRecorder->stop(); }
#ifndef CAMERAMAINWINDOW_H #define CAMERAMAINWINDOW_H #include#include #include #include #include #include #include namespace Ui { class CameraMainWindow; } class CameraMainWindow : public QMainWindow { Q_OBJECT public: explicit CameraMainWindow(QWidget *parent = 0); ~CameraMainWindow(); private: Ui::CameraMainWindow *ui; QCamera *curCamera=Q_NULLPTR;// QCameraImageCapture *imageCapture; //抓图 QMediaRecorder* mediaRecorder;//录像 QLabel*LabCameraState ; QLabel *LabInfo; QLabel *LabCameraMode; void iniCamera();//初始化 void iniImageCapture();//初始化静态画图 void iniVideoRecorder ();//初始化视频录制 private slots: void on_stateChanged(QCamera::State state); void on_captureModeChanged(QCamera::CaptureModes); void on_cameradurationChanged(qint64); void on_camerastateChanged(QMediaRecorder::State); void on_imageReadyForCapture (bool ready); void on_imageCaptured(int id,const QImage &preview) ; void on_imageSaved(int id, const QString &fileName) ; void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); void on_pushButton_6_clicked(); }; #endif // CAMERAMAINWINDOW_H
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)