勇研究了一下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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路


















