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界面上显示。
小结: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主线程连通方法的内容介绍完了,在坛子里逛了一圈,解决线程的问题还真不少,最后还是希望本文对你有帮助。
相关文章推荐
- 1017. Queueing at Bank (25)
- iOS开发UI篇—transframe属性(形变)
- 功能强大的UI效果类库--TapkuLibrary
- IOS开发UI进阶之UITableView二
- Android UI之布局
- ç7—UIViewController
- UIGestureRecognizer
- UISlider和UIImageView
- druid连接池配置
- x == y, true or false ? look, just a picture!
- [APUE] 再读之进程控制
- - dequeueReusableCellWithIdentifier:
- iOS开发:UITableView简单介绍
- [UIImage resizableImageWithCapInsets:]使用注意
- druid配置(转)
- 蓝懿iOS培训日志3 UI第一课及学习心得
- UIButton中setTitleEdgeInsets和setImageEdgeInsets的使用
- DuiLib : 模拟百度网页的填写和搜索
- UIday0901:UITableView 1 表视图的属性和用法 1
- iOS开发:UINavigationController导航控制器