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

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

  • 在QThread线程中不能直接建立QWidget之类的界面组件.
  • 由于在QT中,全部界面组件相关的操做都必须在主线程中(也就是GUI thread)
  • 因此, QThread线程不能直接操做界面组件.

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

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

 

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

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

 

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

通常使用该函数(用来调用对方的私有信号或槽):this

该函数的链接方式默认使用的是Qt::AutoConnectionspa

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

 

好比,当咱们想调用一个obj下的compute(QString, int, double)槽函数时:线程

则只须要写入:code

QMetaObject::invokeMethod(obj, "compute", Q_ARG(QString, "sqrt"), Q_ARG(int, 42), Q_ARG(double, 9.7));

示例以下所示:对象

在Testtherd线程类里经过invokeMethod向父界面类的paintMsg槽函数发送信息blog

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); }

运行效果以下:

 

相关文章
相关标签/搜索