欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

41.35.QT-多线程与界面之间交互总结

程序员文章站 2022-04-28 14:44:26
1. 线程与界面组件需要注意的地方 在QThread线程中不能直接创建QWidget之类的界面组件. 因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUI thread) 所以, QThread线程不能直接操作界面组件. 2.QThread线程如何操作界面组件-方法1 将多线程类对象封 ......

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

  • 在qthread线程中不能直接创建qwidget之类的界面组件.
  • 因为在qt中,所有界面组件相关的操作都必须在主线程中(也就是gui thread)
  • 所以, qthread线程不能直接操作界面组件.

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

  • 将多线程类对象封装为gui界面类的类成员
  • 然后在子线程定义信号函数,通过信号槽机制,向界面组件emit发射信号,从而实现间接操作.

 

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

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

 

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

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

41.35.QT-多线程与界面之间交互总结

该函数的连接方式默认使用的是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);
}

运行效果如下:

 41.35.QT-多线程与界面之间交互总结