QT_Demo(1)之实现多线程实现简单的电脑摄像头视频流开关
- 使用qt中的多线程进行功能控制:继承QThread
- 直接通过代码进行UI搭建
- 简单示例使用信号与槽
1. 功能介绍
-
首先想搭一个界面可以交互,从而实现手动开关笔记本摄像头的目的
-
想通过多线程进行功能实现,从而提升稳定性和运行速度
-
基础界面设置为
QWidget
,图像通过QLabel
显示 -
界面一览:
-
创建项目
- 我用的是VS中的qt插件 qt tools 来进行界面开发,如果没有在
扩展->管理扩展->联网下载
即可 - 下方给出了两种工程种类,1是一个全空的qt 工程,2比1多了个UI文件,并在创建项目的时候可以选择UI文件的基类,在此我选择2进行开发吧
- 工程2自带了UI文件,我目前对纯代码界面开发还不太熟练,稍微复杂的话还是直接通过QDesigner打开UI文件直接进行拉控件搭界面简单易行一些
- 我用的是VS中的qt插件 qt tools 来进行界面开发,如果没有在
-
基类可以在QMainWindow 、QWidget、QDialog中选择,这里随便选一个,先进入工程
-
选择完成后工程文件列表如下:
2. 代码实现
-
本文中主要通过纯代码进行UI搭建
-
本次使用了opencv,需要在项目属性中配置opencv
-
右键项目添加新建项 -> 添加类
-
代码如下:
-
VideoDisplayWidget.h
#include <QApplication>
#include <QWidget>
#include <QImage>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>
#include <QThread>
#include <opencv2/opencv.hpp>
#include <QPainter>
#include <QMouseEvent>
#include <QWheelEvent>
// 视频采集线程
class VideoCaptureThread : public QThread
{
Q_OBJECT
public:
VideoCaptureThread(QObject* parent = nullptr);
~VideoCaptureThread();
void startCapture();
void stopCapture();
void run() override;
public:
cv::VideoCapture cap;
signals:
void newFrame(const QImage& frame); // 向主线程发送新帧
private:
bool running;
};
// 主窗口类
class VideoDisplayWidget : public QWidget
{
Q_OBJECT
public:
VideoDisplayWidget(QWidget* parent = nullptr);
~VideoDisplayWidget();
public slots:
void onNewFrame(const QImage& frame);
// 启动视频采集线程
void startCapture();
// 停止视频采集线程
void stopCapture();
private:
QLabel* label;
VideoCaptureThread* captureThread;
};
VideoDisplayWidget.cpp
#include"VideoDisplayWidget.h"
// 视频采集线程
VideoCaptureThread::VideoCaptureThread(QObject* parent) : QThread(parent), running(false) {
}
VideoCaptureThread::~