您的位置:首页 > 产品设计 > UI/UE

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

2015-09-05 21:51 519 查看
本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制。

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

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

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

以QString为例,注册时首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType<QString>("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);
}


小结:QT中实现Thread与GUI主线程连通方法的内容介绍完了,在坛子里逛了一圈,解决线程的问题还真不少,最后还是希望本文对你有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: