Chinaunix首页 | 论坛 | 博客
  • 博客访问: 848564
  • 博文数量: 143
  • 博客积分: 455
  • 博客等级: 一等列兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 00:11
文章分类

全部博文(143)

文章存档

2018年(10)

2017年(6)

2016年(28)

2015年(14)

2014年(67)

2013年(1)

2012年(17)

我的朋友

分类: LINUX

2012-09-21 16:27:37

本文介绍的是QT中实现Thread与GUI主线程通,目前只会一种,采用信号槽机制。
通常情况下,信号机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个。然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变。
connect的第五个参数Qt::QueuedConnection表示函数由接受信号的线程所执行,如果不加表示函数由发出信号的次线程执行。当传递信号的参数类型不是QT的元类型时要先注册,关于QT的元类型可以参看QT文档
QMetaType这个类里面列举了所有的元类型。
以QString为例,注册时首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType("QString");加上这两句就注册成功了。
贴个示例的代码,次线程不断更改一个QString传给GUI主线程,主线程在GUI界面上显示。

1.            mythread.h  

2.            #ifndef MYTHREAD_H  

3.            #define MYTHREAD_H  

4.            #include  

5.            class MyThread : public QThread  

6.            {  

7.            Q_OBJECT  

8.            public:  

9.            MyThread();  

10.        ~MyThread();  

11.        protected:  

12.        void run();  

13.        signals:  

14.        void changeText(QString str);  

15.        };  

16.        #endif // MYTHREAD_H  

17.        widgett.h  

18.        #ifndef WIDGETT_H  

19.        #define WIDGETT_H  

20.        #include /QMainWindow> 

21.        #include "ui_widgett.h"  

22.        class WidgetT : public QMainWindow  

23.        {  

24.        Q_OBJECT  

25.        public:  

26.        WidgetT(QWidget *parent = 0, Qt::WFlags flags = 0);  

27.        ~WidgetT();  

28.        private:  

29.        Ui::WidgetTClass ui;  

30.        private slots:  

31.        void labelSetText(QString qstr);  

32.        };  

33.        #endif // WIDGETT_H  

34.        mythread.cpp  

35.        #include "mythread.h"  

36.        MyThread::MyThread()  

37.        : QThread()  

38.        {  

39.        }  

40.        MyThread::~MyThread()  

41.        {  

42.        }  

43.        void MyThread::run(){  

44.        static int i=0;  

45.        while(true)  

46.        {  

47.        ++i;  

48.        QString strnum = QString::number(i);  

49.        emit changeText(strnum);  

50.         

51.        QThread::sleep(1);  

52.        }  

53.        }  

54.        widgett.cpp  

55.        #include "widgett.h"  

56.        #include "mythread.h"  

57.        Q_DECLARE_METATYPE(QString);  

58.        WidgetT::WidgetT(QWidget *parent, Qt::WFlags flags)  

59.        : QMainWindow(parent, flags)  

60.        {  

61.        ui.setupUi(this);  

62.        MyThread *mythread = new MyThread;  

63.        int id=qRegisterMetaType("");  

64.        connect(mythread,SIGNAL(changeText(QString)),this,SLOT(labelSetText(QString)),Qt::QueuedConnection);  

65.        mythread->start();  

66.        }  

67.        WidgetT::~WidgetT()  

68.        {  

69.        }  

70.        void WidgetT::labelSetText(QString qstr){  

71.        ui.label->setText(qstr);  

72.       

小结:QT中实现Thread与GUI主线程连通方法的内容介绍完了,最后还是希望本文对你有帮助。
附:   使用自定义的信号和槽,需要注意以下几点:
            1、类的声明和实现分别放在.h和.cpp文件中; 
            2、类声明中包含Q_OBJECT宏;
            3、信号只要声明不要设计其的实现函数;
            4、发射信号用emit关键字; 
            5、自定义槽的实现与普通成员函数的实现一样。
 
 
阅读(6895) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~