栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从后台工作线程修改Qt GUI

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从后台工作线程修改Qt GUI

关于Qt的重要一点是, 必须 仅从GUI线程(即主线程)使用Qt GUI。

这就是为什么执行此操作的正确方法是从worker 通知 主线程,并且主线程中的代码实际上将更新文本框,进度栏或其他内容。

我认为,做到这一点的最佳方法是使用QThread而不是posix线程,并使用Qt 信号
在线程之间进行通信。这将是您的工作人员,是以下人员的替代者

thread_func

class WorkerThread : public QThread {    void run() {        while(1) {  // ... hard work  // Now want to notify main thread:  emit progressChanged("Some info");        }    }    // Define signal:    signals:    void progressChanged(QString info);};

在窗口小部件中,定义一个与.h中的信号具有相同原型的 插槽

class MyWidget : public QWidget {    // Your gui pre    // Define slot:    public slots:    void onProgressChanged(QString info);};

在.cpp中实现此功能:

void MyWidget::onProgressChanged(QString info) {    // Processing pre    textBox->setText("Latest info: " + info);}

现在在您要生成线程的位置(单击按钮):

void MyWidget::startWorkInAThread() {    // Create an instance of your woker    WorkerThread *workerThread = new WorkerThread;    // Connect our signal and slot    connect(workerThread, SIGNAL(progressChanged(QString)),    SLOT(onProgressChanged(QString)));    // Setup callback for cleanup when it finishes    connect(workerThread, SIGNAL(finished()), workerThread, SLOT(deleteLater()));    // Run, Forest, run!    workerThread->start(); // This invokes WorkerThread::run in a new thread}

将信号和插槽连接后,

emitprogressChanged(...)
在工作线程中发出带有插槽的插槽将向主线程发送消息,并且主线程将在
onProgressChanged
此处调用与该信号连接的插槽。

附言:我尚未测试代码,所以如果我在某处输入错误,请随时提出修改建议



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号