本文介绍的是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主线程连通方法的内容介绍完了,在坛子里逛了一圈,解决线程的问题还真不少,最后还是希望本文对你有帮助。