前言:
之前写过一篇 QT5基于QCamera实现的各种摄像头(USB摄像头,系统摄像头,网络摄像头)显示,截图,保存功能。有很多写的不清楚的地方,正好趁《QT简单入门实例》这个系列,再梳理一下QCamera的最基本用法。
老规矩,先看运行效果:
功能:
1 可自动检测连接的摄像头,并可在左下角选择。
2 可打开摄像头。关闭摄像头。
3 可选择本地路径进行截图保存
源代码(界面设计通过代码实现):
.pro中需要添加下面两句话,用来导入QT的多媒体模块:
QT += multimedia #添加模块
QT += multimediawidgets #添加模块
mainwindow.h 在类体内部需要添加一句话,用来定义按钮槽:
private slots:
void pushbutton_slot(); //按钮槽
接下来就是主体代码 mainwindow.cpp (100行左右)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QCameraInfo>
#include <QFileDialog>
#include <QDebug>
#include <QLayout>
#include <QList>
#include <QComboBox>
#include <QPushButton>
#include <QFont>
QCamera *camera; //相机
QCameraViewfinder *viewfinder; //取景器
QCameraImageCapture *imageCapture; //图片捕获器
QComboBox* combobox; //下拉框
QPushButton *pushbutton_open; //按钮(打开相机)
QPushButton *pushbutton_capture; //按钮(截图
QList<QCameraInfo> list;
QVBoxLayout* vlayout;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("QCamera");
//初始化最外层布局
QWidget* widget = new QWidget(this); //新建一个widget
vlayout = new QVBoxLayout(this); //创建一个垂直布局
widget->setLayout(vlayout); //将layout添加到widget区域中
this->setCentralWidget(widget); //将widget设置为中心窗口
//新建控件
combobox=new QComboBox(this); //新建下拉框
pushbutton_open=new QPushButton("打开相机",this); //按钮(打开相机)
pushbutton_capture=new QPushButton("保存截图",this); //按钮(截图)
//设置控件的ObjectName
combobox->setObjectName("combobox");
pushbutton_open->setObjectName("pushbutton_open");
pushbutton_capture->setObjectName("pushbutton_capture");
//设置控件的尺寸
combobox->setFixedHeight(40);
pushbutton_open->setFixedSize(QSize(120,40));
pushbutton_capture->setFixedSize(QSize(120,40));
//设置控件的字体
QFont font;
font.setFamily("微软雅黑");
font.setPointSize(10);
combobox->setFont(font);
pushbutton_open->setFont(font);
pushbutton_capture->setFont(font);
//新建内层布局,并将控件添加到布局
QHBoxLayout* hlayout = new QHBoxLayout(this);
hlayout->addWidget(combobox);
hlayout->addWidget(pushbutton_open);
hlayout->addWidget(pushbutton_capture);
//初始化下拉框内容
list= QCameraInfo::availableCameras();
for (int i = 0; i < list.size(); i++)
combobox->addItem(list.at(i).description());
//设置相机,取景器,捕获器
viewfinder=new QCameraViewfinder(this);
vlayout->addWidget(viewfinder); //垂直布局第一行,添加一个viewfinder
vlayout->addLayout(hlayout); //垂直布局第二行,添加一个水平布局,用来存放一个下拉框和两个按钮
//信号槽连接,多对一
connect(pushbutton_open,SIGNAL(clicked(bool)),this,SLOT(pushbutton_slot()));
connect(pushbutton_capture,SIGNAL(clicked(bool)),this,SLOT(pushbutton_slot()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::pushbutton_slot()
{
if(sender()->objectName() == "pushbutton_open"){
if(pushbutton_open->text() == "打开相机") {
//设置相机,取景器,捕获器
delete camera;
delete imageCapture;
camera=new QCamera(list.at(combobox->currentIndex()));
QCameraViewfinder* viewfinder_old=viewfinder;
viewfinder=new QCameraViewfinder(this);
imageCapture=new QCameraImageCapture(camera);
camera->setViewfinder(viewfinder);
vlayout->replaceWidget(viewfinder_old,viewfinder);
viewfinder_old->close();
delete viewfinder_old;
camera->start();
pushbutton_open->setText("关闭相机");
}
else{
camera->stop();
pushbutton_open->setText("打开相机");
}
}
else if(sender()->objectName() == "pushbutton_capture"){
QString filename=QFileDialog::getSaveFileName(this,tr("Save Image"), \
QDir::homePath(),tr("(*.jpg)\n(*.bmp)\n(*.png)"));
if(!filename.isEmpty() ){
imageCapture->capture(filename);
ui->statusBar->showMessage(tr("Save Image Success!"),3000);
}
else
ui->statusBar->showMessage(tr("Save Image Cancel!"),3000);
}
}
完结撒花~
如果你配置了opencv环境,还是推荐使用opencv进行图像采集,毕竟那也是个很强大的框架~