QT中如何实现Thread与GUI的主线程连通

155 篇文章 26 订阅

QT中如何实现Thread与GUI的主线程连通

本文介绍的是QT中实现ThreadGUI主线程通,目前只会一种,采用信号槽机制。

通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个槽。然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改QObject::connect()的第5个可选参数而改变。

connect的第五个参数Qt::QueuedConnection表示槽函数由接受信号的线程所执行,如果不加表示槽函数由发出信号的次线程执行。当传递信号的参数类型不是QT的元类型时要先注册,关于QT的元类型可以参看QT文档

QMetaType这个类里面列举了所有的元类型。

QString为例,注册时首先Q_DECLARE_METATYPE(QString);然后,int id=qRegisterMetaType("QString");加上这两句就注册成功了。

贴个示例的代码,次线程不断更改一个QString传给GUI主线程,主线程在GUI界面上显示。

mythread.h 

#ifndef MYTHREAD_H 

#define MYTHREAD_H 

#include 

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 /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(""); 

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

       mythread->start(); 

WidgetT::~WidgetT() 

void WidgetT::labelSetText(QString qstr){ 

       ui.label->setText(qstr); 

}

【小结】

使用自定义的信号和槽,需要注意以下几点:

  1. 类的声明和实现分别放在.h.cpp文件中;
  2. 类声明中包含Q_OBJECT宏;
  3. 信号只要声明不要设计其的实现函数;
  4. 发射信号用emit关键字;
  5. 自定义槽的实现与普通成员函数的实现一样。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值