QT中實(shí)現(xiàn)Thread與GUI主線程連通方法
本文介紹的是QT中實(shí)現(xiàn)Thread與GUI主線程通,目前只會(huì)一種,采用信號(hào)槽機(jī)制。
通常情況下,信號(hào)和槽機(jī)制可以同步操作,這就意味著在發(fā)射信號(hào)的時(shí)候,使用直接函數(shù)即可以立刻調(diào)用連接到一個(gè)信號(hào)上的多個(gè)槽。然而,當(dāng)連接位于不同線程中的對(duì)象時(shí),這一機(jī)制就會(huì)變得不同步起來(lái),可以通過(guò)修改QObject::connect()的第5個(gè)可選參數(shù)而改變。
connect的第五個(gè)參數(shù)Qt::QueuedConnection表示槽函數(shù)由接受信號(hào)的線程所執(zhí)行,如果不加表示槽函數(shù)由發(fā)出信號(hào)的次線程執(zhí)行。當(dāng)傳遞信號(hào)的參數(shù)類型不是QT的元類型時(shí)要先注冊(cè),關(guān)于QT的元類型可以參看QT文檔
QMetaType這個(gè)類里面列舉了所有的元類型。
以QString為例,注冊(cè)時(shí)首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType<QString>("QString");加上這兩句就注冊(cè)成功了。
貼個(gè)示例的代碼,次線程不斷更改一個(gè)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);
- }
小結(jié):QT中實(shí)現(xiàn)Thread與GUI主線程連通方法的內(nèi)容介紹完了,在壇子里逛了一圈,解決線程的問(wèn)題還真不少,***還是希望本文對(duì)你有幫助。