1

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

以下是我的一段代码。

通用函数
QProgressDialog *progressBarDialog;

泛型函数.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();
    }
4

1 回答 1

2

QProgressDialog 类是一个 GUI 类。您不能在工作线程中实例化它。

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

GUI线程和工作线程

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

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

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

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

于 2018-10-25T19:32:23.017 回答