41.35.QT-多线程与界面之间交互总结
2019-05-23 09:54:11来源:博客园 阅读 ()
1. 线程与界面组件需要注意的地方
- 在QThread线程中不能直接创建QWidget之类的界面组件.
- 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread)
- 所以, QThread线程不能直接操作界面组件.
2.QThread线程如何操作界面组件-方法1
- 将多线程类对象封装为GUI界面类的类成员
- 然后在子线程定义信号函数,通过信号槽机制,向界面组件emit发射信号,从而实现间接操作.
3.QThread线程如何操作界面组件-方法2
- 使用QApplication::postEvent()实现向界面发送事件,从而能够封装一个自定义类
4.使用Invokes()函数来调用界面组件的信号槽-方法3
一般使用该函数(用来调用对方的私有信号或槽):
该函数的连接方式默认使用的是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<count;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); }
运行效果如下:
原文链接:https://www.cnblogs.com/lifexy/p/10907901.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C++类中的函数重载
下一篇:C++中操作符重载的概念
- 开源项目SMSS开发指南(二)——基于libevent的线程池 2020-01-11
- c++11多线程记录0 2019-10-25
- C/C++、Qt4实现FTP客户端(有无界面版) 2019-09-17
- C++11多线程相关 2019-09-04
- C++多线程基础学习笔记(十) 2019-08-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash