首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >冻结图形用户界面时用QMessageBox显示QThread

冻结图形用户界面时用QMessageBox显示QThread
EN

Stack Overflow用户
提问于 2013-11-20 23:19:49
回答 1查看 1.1K关注 0票数 1

当我做一些绘图工作时,Qt冻结了。我想展示“装货.”此时的消息框。我用QThread来做这个,但我做不到。

我的QThread课程

myThread.cpp

代码语言:javascript
复制
#include "myThread.h"
#include <QtCore>

myThread::myThread(QObject *parent) :
    QThread(parent)
{
}

void myThread::run()
{
    emit threadSignal();
}

myThread.h

代码语言:javascript
复制
#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class myThread : public QThread
{
    Q_OBJECT
public:
    explicit myThread(QObject *parent = 0);
    void run();

signals:
    void threadSignal();

public slots:

};

我在我的主头文件中写了

代码语言:javascript
复制
public:
    myThread *mess;
    QMessageBox box;

public slots:
    void threadSlot();

我在我的主cpp文件中写道:

代码语言:javascript
复制
Archive::Archive(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Archive)
{
    ui->setupUi(this);

    mess=new myThread(this);
    connect(mess, SIGNAL(threadSignal()), this, SLOT(threadSlot()));
    box.setWindowFlags(Qt::WindowStaysOnTopHint);
}

void Archive::threadSlot()
{
    box.show();
}

在我的主cpp文件中有一个冻结GUI的函数。

代码语言:javascript
复制
void Archive::plot()
{
    mess->start();

    //heavy work. It takes 2-3 second and GUI become unresponsive.

}

我要先启动这个线程,然后显示QmessageBox。功能结束后,QmessageBox就消失了。但是,使用此代码,QmessageBox将在plot()函数结束后显示。为什么是这样的行为?

我使用QT4.8.5

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-21 07:28:20

Qt中的GUI类只能从主线程访问。

这个问题的官方解决方案是在不同的线程中完成繁重的工作,而不是让GUI冻结。有关在Qt中使用线程的不同方式,请参见https://doc.qt.io/qt-5/threads-technologies.html

警告:,您应该向从QThread派生的类中添加槽,而不是。来自文档(https://doc.qt.io/qt-5/qthread.html):

重要的是要记住,QThread实例存在于实例化它的旧线程中,而不是在调用run()的新线程中。这意味着QThread的所有排队插槽都将在旧线程中执行。因此,希望调用新线程中的槽的开发人员必须使用worker对象方法;不应该将新的槽直接实现到子类QThread中。

这些链接适用于Qt 5,但大多数概念也适用于QT4.8。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20109223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档