41.QT-多线程与界⾯之间交互总结
1. 线程与界⾯组件需要注意的地⽅
在QThread线程中不能直接创建QWidget之类的界⾯组件.
因为在QT中,所有界⾯组件相关的操作都必须在主线程中(也就是GUI thread)
所以, QThread线程不能直接操作界⾯组件.
2.QThread线程如何操作界⾯组件-⽅法1
将多线程类对象封装为GUI界⾯类的类成员
然后在⼦线程定义信号函数,通过信号槽机制,向界⾯组件emit发射信号,从⽽实现间接操作.
aol
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槽函数发送信息
the brainvoid Testtherd::run()
德语学习软件{
diogenes
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);zhuaxia
}
}
⽗界⾯类的paintMsg槽函数如下所⽰:
void loginwindow:: paintMsg(QString msg) {
this->LineHint->tText(msg);
英语转换汉语>empty怎么读}
运⾏效果如下: