勇研究了一下QT的多线程,是一个QThread的类,使用方法也C#的Thread类相似。
QT的ui界面也称为界面线程,只有它可以更新UI上面的信息,其它的子线程如果想要更新Ui信息,必须通过消息传递给主线程进行更新。
这个其实也是和C# 中一样的。
在C#中,子线程通过通过调用主界面上的控件的Invoke来委托ui线程执行更新信息的任务。
Thread.h
#pragma once #include <QObject> #include <QThread> class Thread : public QThread { Q_OBJECT private: int number; protected: void run(); public: Thread(QObject *parent=0); ~Thread(); signals: void UpdateSignal(int num); public slots: void ResetSlot(); };
Thread.cpp
#include "Thread.h" Thread::Thread(QObject *parent) { number = 0; } Thread::~Thread() { } void Thread::run() { while (1) { emit UpdateSignal(number); number++; sleep(1); } } void Thread::ResetSlot() { number = 0; emit UpdateSignal(number); }
QtForOpencv.h
#pragma once #include <QtWidgets/QWidget> #include "ui_QtForOpencv.h" #include <QLabel> #include <qthread.h> #include "Thread.h" class QtForOpencv : public QWidget { Q_OBJECT public: QtForOpencv(QWidget *parent = Q_NULLPTR); private: Ui::QtForOpencvClass ui; Thread *myThread; int number; signals: void ResetSignal(); public slots: void ClearSlot(); void StartSlot(); void StopSlot(); void UpdateSlot(int num); public: QLabel* imgLabel; };
QtForOpencv.cpp
#include "QtForOpencv.h" #include <opencv2\opencv.hpp> #include <opencv2\core.hpp> #include <opencv2\imgcodecs.hpp> #include <opencv2\imgproc.hpp> using namespace cv; using namespace std; QtForOpencv::QtForOpencv(QWidget *parent) : QWidget(parent) { ui.setupUi(this); myThread = new Thread; connect(ui.btnStop,SIGNAL(clicked()),this, SLOT(StopSlot())); connect(ui.btnStart, SIGNAL(clicked()),this, SLOT(StartSlot())); connect(ui.btnReset, SIGNAL(clicked()),this, SLOT(ClearSlot())); connect(myThread, SIGNAL(UpdateSignal(int)),this, SLOT(UpdateSlot(int))); connect(this, SIGNAL(ResetSignal()),myThread, SLOT(ResetSlot())); setWindowTitle("Thread Test"); //resize(200, 200); myThread->start(); waitKey(0); } void QtForOpencv::StartSlot() { myThread->start(); } void QtForOpencv::StopSlot() { myThread->terminate(); } void QtForOpencv::UpdateSlot(int num) { ui.labMsg->setText(QString::number(num)); } void QtForOpencv::ClearSlot() { emit ResetSignal(); }
运行后,子线程在后台计数并通知UI线程上显示数字。
按停止后,按启动可以继续计数。
复位后从0重新开始计数。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


