gpt4 book ai didi

c++ - GUI 卡住时显示带有 QThread 的 QMessageBox

转载 作者:行者123 更新时间:2023-11-28 00:38:12 32 4
gpt4 key购买 nike

当我做一些绘图工作时,Qt GUI 卡住了。我想在这个时候显示“正在加载..”消息框。我为此使用了 QThread,但我做不到。

我的 QThread 类

我的线程.cpp

#include "myThread.h"
#include <QtCore>

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

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

我的线程.h

#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:

};

我写在我的主头文件中

public:
myThread *mess;
QMessageBox box;

public slots:
void threadSlot();

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

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 的函数。

void Archive::plot()
{
mess->start();

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

}

我希望该线程首先启动并显示 QmessageBox。 plot() 函数结束后,QmessageBox 消失了。但是使用这段代码 QmessageBox 在 plot() 函数结束后显示。为什么会这样?

我使用 Qt 4.8.5

谢谢。

最佳答案

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

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

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

It is important to remember that a QThread instance lives in the old thread that instantiated it, not in the new thread that calls run(). This means that all of QThread's queued slots will execute in the old thread. Thus, a developer who wishes to invoke slots in the new thread must use the worker-object approach; new slots should not be implemented directly into a subclassed QThread.

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

关于c++ - GUI 卡住时显示带有 QThread 的 QMessageBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20109223/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com