qt 线程与ui线程同步
admin
2023-01-29 01:20:04
0


QT UI 与线程同步

目前只会一种,采用信号槽机制。
通常情况下,信号和槽机制可以同步操作,这就意味着在发射信号的时候,使用直接函数即可以立刻调用连接到一个信号上的多个槽。
然而,当连接位于不同线程中的对象时,这一机制就会变得不同步起来,可以通过修改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
#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... 近日,一位来自广东的陈女士(化名)反映称,去年多年未见的初中同学孔某趁她聚餐醉酒、丧失反抗能力之机,...
美军被疑隐瞒对伊作战伤亡 【环球时报综合报道】美国国防部21日发表声明说,一名美军士兵17日在伊朗针对位于约旦的穆沃费格萨勒提...
OpenAI模型“越狱”攻击,... 一家美国公司遭到美国AI攻击,而提供保护的竟是一款中国人工智能工具。AI工具平台Hugging Fa...
南航第十二架C919国产大飞机... 广州7月21日电 (记者 郭军)7月21日,一架尾号为B-659G的国产大飞机飞抵广州白云国际机场,...
无人艇第一股,要来了 那个被资本追捧的“无人艇第一股”,要来了。 2017年冬天的一个夜晚,港珠澳大桥附近的海面上,81条...
三一锂能取得电池包专利提升电芯... 国家知识产权局信息显示,三一锂能有限公司取得一项名为“电池包”的专利,授权公告号CN22453717...
价格为何下滑?市场竞争力为何不... 记者采访西瓜种植主产区河南开封等地如何种得好,又能卖得好(经济聚焦)本报记者 常 钦 《人民日报》(...