【问题标题】:how to make a modal QProgressDialog in QT?如何在 QT 中制作模态 QProgressDialog?
【发布时间】:2018-10-25 13:29:44
【问题描述】:

我正在从一个线程调用 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();
    }

【问题讨论】:

  • 槽被另一个QThread调用?

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


【解决方案1】:

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

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

GUI线程和工作线程

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

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

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

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

【讨论】:

  • 谢谢,我在主窗口中创建了一个插槽并从工作线程发出信号,进一步我将 W​​indowModality 设置为 ApplicationModal 并通过这种方式能够阻止父窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多