By
sys.linux.d
Updated:
Contents
qt中thread与GUI线程互通的一种方法,采用信号槽的机制。
通常的情况下,信号和槽机制是可以同步操作的,这就意味着在发射信号的时候,可以使用直接函数,立即调用链接在同一信号的多个槽。然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变。
connect的第五个参数Qt::QueuedConnection表示槽函数由接受信号的线程所执行,如果不加表示槽函数由发出信号的次线程执行。当传递信号的参数类型不是QT的元类型时要先注册,关于QT的元类型可以参看QT文档。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #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
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #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); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #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); }
|
注: 这只是很简单的一种