勇哥的VC++应用框架学习之QT(8) 多线程更新UI控件的信息


勇研究了一下QT的多线程,是一个QThread的类,使用方法也C#的Thread类相似。

QT的ui界面也称为界面线程,只有它可以更新UI上面的信息,其它的子线程如果想要更新Ui信息,必须通过消息传递给主线程进行更新。

这个其实也是和C# 中一样的。

在C#中,子线程通过通过调用主界面上的控件的Invoke来委托ui线程执行更新信息的任务。


image.png

image.png


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重新开始计数。

image.png


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864