如何在QT中制作模式QProgressDialog?

时间:2018-10-25 13:29:44

标签: c++ qt modal-dialog qt5 qprogressdialog

我正在从线程调用QProgressDialog,即使将setModal设置为true,也无法将其作为模式窗口。我希望在执行QProgressDialog时阻止主窗口。

以下是我的代码。

GenericFunc.h
QProgressDialog *progressBarDialog;

GenericFunc.cpp

     void GenericFunc::testSlot()
    {
        int numTasks = 4500;
        progressBarDialog = new QProgressDialog("Task in progress.", "Cancel", 0, numTasks);
        progressBarDialog->setWindowModality(Qt::WindowModal);
        progressBarDialog->setModal(true);
        progressBarDialog->exec();
    }

1 个答案:

答案 0 :(得分:2)

QProgressDialog类是GUI类。您无法在辅助线程中实例化该对象。

http://doc.qt.io/qt-5/thread-basics.html#gui-thread-and-worker-thread

  

GUI线程和辅助线程

     

如上所述,每个程序在启动时都有一个线程。这个   线程被称为“主线程”(也称为“ GUI线程”   Qt应用程序)。 Qt GUI必须在此线程中运行。所有小部件和   几个相关的类(例如QPixmap)在辅助类中不起作用   线程。辅助线程通常称为“工人”   线程”,因为它用于从主服务器上分担处理工作   线程。

使用信号插槽将进度数据从工作线程传递到gui线程。

另一个问题是,您将其设置为WindowModal,但是此progressBarDialog没有任何父项,因此它不会阻塞任何父项窗口链。

http://doc.qt.io/qt-5/qt.html#WindowModality-enum