QT中实现Thread与GUI主线程连通方法

本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制。

通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个槽。然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变。

connect的第五个参数Qt::QueuedConnection表示槽函数由接受信号的线程所执行,如果不加表示槽函数由发出信号的次线程执行。当传递信号的参数类型不是QT的元类型时要先注册,关于QT的元类型可以参看QT文档

QMetaType这个类里面列举了所有的元类型。

以QString为例,注册时首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType(“QString”);加上这两句就注册成功了。

贴个示例的代码,次线程不断更改一个QString传给GUI主线程,主线程在GUI界面上显示。

mythread.h  
#ifndef MYTHREAD_H  
#define MYTHREAD_H  
#include <QThread> 
class MyThread : public QThread  
{  
Q_OBJECT  
public:  
MyThread();  
~MyThread();  
protected:  
void run();  
signals:  
void changeText(QString str);  
};  
#endif // MYTHREAD_H  
widgett.h  
#ifndef WIDGETT_H  
#define WIDGETT_H  
#include <QtGui/QMainWindow> 
#include "ui_widgett.h"  
class WidgetT : public QMainWindow  
{  
Q_OBJECT  
public:  
WidgetT(QWidget *parent = 0, Qt::WFlags flags = 0);  
~WidgetT();  
private:  
Ui::WidgetTClass ui;  
private slots:  
void labelSetText(QString qstr);  
};  
#endif // WIDGETT_H  
mythread.cpp  
#include "mythread.h"  
MyThread::MyThread()  
: QThread()  
{  
}  
MyThread::~MyThread()  
{  
}  
void MyThread::run(){  
static int i=0;  
while(true)  
{  
++i;  
QString strnum = QString::number(i);  
emit changeText(strnum);  

QThread::sleep(1);  
}  
}  
widgett.cpp  
#include "widgett.h"  
#include "mythread.h"  
Q_DECLARE_METATYPE(QString);  
WidgetT::WidgetT(QWidget *parent, Qt::WFlags flags)  
: QMainWindow(parent, flags)  
{  
ui.setupUi(this);  
MyThread *mythread = new MyThread;  
int id=qRegisterMetaType<QString>("");  
connect(mythread,SIGNAL(changeText(QString)),this,SLOT(labelSetText(QString)),Qt::QueuedConnection);  
mythread->start();  
}  
WidgetT::~WidgetT()  
{  
}  
void WidgetT::labelSetText(QString qstr){  
ui.label->setText(qstr);  
} 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值