QT简单入门实例10【100行代码实现的的QCamera摄像头应用,可打开多个摄像头,可全屏】

前言:

之前写过一篇 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进行图像采集,毕竟那也是个很强大的框架~

发布了24 篇原创文章 · 获赞 8 · 访问量 9639

猜你喜欢

转载自blog.csdn.net/Sun_tian/article/details/104377638