VS+Qt多线程开发中传参数的问题
需求:子线程程序采集图像,窗口线程实时显示图像
平台:VS2017+QT4.5
实现方法:
1创建继承QObject的ImageContinuous类,实现连续采集图像
2主线程内创建ImageContinuous的对象指针,同时创建QThread类的对象指针
3子线程内创建槽函数,实现连续采集功能
4子线程内创建信号,像主线程发送信号,信号带参数cv::Mat型;
5主线程创建信号start,发送start触发子线程的连续采集槽函数;
6连续采集槽函数每采集一张图,向主线程发送一次信号,信号包含图像内容
7主线程接收到子线程信号,更新ui图像显示
子线程类代码,头文件
#pragma once #include <qobject.h> #include "MvcCamera.h" class ImageContinuous : public QObject { Q_OBJECT public: //explicit ImageContinuous(QObject *parent = 0) : QObject(parent) {} ImageContinuous(); ~ImageContinuous(); public slots: void getImage(MvcCamera &m_camera); signals: void imageInfo(cv::Mat temp); };
子线程类代码,源文件
#include "ImageContinuous.h" #include "QThread.h" #include <QDebug> ImageContinuous::ImageContinuous() { } ImageContinuous::~ImageContinuous() { } void ImageContinuous::getImage(MvcCamera &m_camera) { //QTimer::singleShot();//此函数可用,后期研究 while (true) { cv::Mat m_image = m_camera.CaptureOneImage(); cv::Mat m_imageToShow_1; //原始分辨率,2048*1536,缩小512*384 cv::resize(m_image, m_imageToShow_1, cv::Size(m_image.cols / 4, m_image.rows / 4), 0, 0, CV_INTER_LINEAR); emit imageInfo(m_imageToShow_1); QThread::msleep(30); //qDebug() << "current threadID:" << QThread::currentThread() << endl; } }
主线程内部分代码,类的实例定义
private: ImageContinuous *m_imageConti; QThread *m_realtimeImageThread;
槽函数定义
void showRealTimeVideo(cv::Mat image);
启动采图的信号定义
void startChildThread(MvcCamera &m_camera);
部分源文件代码,槽信号传递自定义类型参数时必须使用注册的方式,一开始采用信号的连接方式为Qt:DirectionConnect,代码可以编译过去,但是参数传递不过去,并且会导致无法开启子线程!!
//分配内存 m_imageConti = new ImageContinuous; m_realtimeImageThread = new QThread; //自定义类型作为槽信号的参数,需要先注册 qRegisterMetaType<cv::Mat>("cv::Mat"); qRegisterMetaType<MvcCamera>("MvcCamera&"); connect(m_realtimeImageThread, &QThread::finished, m_imageConti, &QObject::deleteLater); connect(m_realtimeImageThread, &QThread::finished, m_realtimeImageThread, &QObject::deleteLater); connect(this, &QtWeldingRobotControlSystem::startChildThread, m_imageConti, &ImageContinuous::getImage); connect(m_imageConti, &ImageContinuous::imageInfo, this, &QtWeldingRobotControlSystem::showRealTimeVideo); m_imageConti->moveToThread(m_realtimeImageThread); //启动子线程 m_realtimeImageThread->start();

浙公网安备 33010602011771号