【问题标题】:Why QProgressDialog is shown without an explicit call to `exec()` or `show()`?为什么显示 QProgressDialog 时没有显式调用 `exec()` 或 `show()`?
【发布时间】:2021-01-16 09:16:22
【问题描述】:

我有以下代码

#include "dialog.h"

#include <QApplication>
#include <QProgressDialog>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QProgressDialog w;
    //w.show();
    return a.exec();
}

这段代码的执行显示了一个 QProgressDialog UI。

我想解释一下为什么我的 QProgressDialog 没有 exec()show() 指令就出现了。 我已经阅读了文档,但没有找到关于它的解释。

【问题讨论】:

  • 我认为这是QProgressDialog 的预期行为。它会自动显示/隐藏。

标签: c++ qt qt5


【解决方案1】:

QProgressDialog 的两个构造函数都调用 QProgressDialogPrivate::init,其中启动了 forceTimer : QTimer

 ...
 forceTimer = new QTimer(q);
 QObject::connect(forceTimer, SIGNAL(timeout()), q, SLOT(forceShow()));
 ...
 forceTimer->start(showTime);

forceShow() 插槽依次如下所示:

void QProgressDialog::forceShow() {
    Q_D(QProgressDialog);
    d->forceTimer->stop();
    if (d->shown_once || d->cancellation_flag)
        return;
    show();
    d->shown_once = true;
}

show(); 语句正是在创建对象时显示QProgressDialog 的原因。

【讨论】:

    【解决方案2】:

    由于构建后会自动打开,所以跟在后面取消。

    auto * progressDialog = new QProgressDialog{};
    progressDialog.cancel();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2020-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      相关资源
      最近更新 更多