c语言线程交互,C/C++知识点之QT-多线程与界面之间交互总结

本篇文章主要讲述C/C++知识点之QT-多线程与界面之间交互总结,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

13668617ec7fde7b49c5a9e62c7380c5.png

1.线程与界面组件需要注意的地方

在QThread线程中不能直接创建QWidget之类的界面组件.

因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread)

所以, QThread线程不能直接操作界面组件.

2.QThread线程如何操作界面组件-方法1

将多线程类对象封装为GUI界面类的类成员

然后在子线程定义信号函数,通过信号槽机制,向界面组件emit发射信号,从而实现间接操作.

3.QThread线程如何操作界面组件-方法2

使用QApplication::postEvent()实现向界面发送事件,从而能够封装一个自定义类

4.使用Invokes()函数来调用界面组件的信号槽-方法3

一般使用该函数(用来调用对方的私有信号或槽):

ff8ca96e213089f3ca2c364d518ca9f3.png

该函数的连接方式默认使用的是Qt::AutoConnection

表示如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

比如,当我们想调用一个obj下的compute(QString, int, double)槽函数时:

则只需要写入:QMetaObject::invokeMethod(obj, "compute",

Q_ARG(QString, "sqrt"),

Q_ARG(int, 42),

Q_ARG(double, 9.7));

示例如下所示:

在Testtherd线程类里通过invokeMethod向父界面类的paintMsg槽函数发送信息void Testtherd::run()

{    int count=0;

while(1)

{

QString str="请稍等,正在验证用户,登录中";

for(int i =0;i

str.append('.');                   //循环添加小数点

count=(count+1)%7;

QMetaObject::invokeMethod(this->parent(), "paintMsg",

Q_ARG(QString, str));

msleep(500);

}

}

父界面类的paintMsg槽函数如下所示:

void loginwindow:: paintMsg(QString msg) {this->LineHint->setText(msg);

}

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值