繁体   English   中英

QT:如何创建简单的 QProgressDialog object

[英]QT: How to create a simple QProgressDialog object

我想在 QGIS 项目的 qgsogrprovider.cpp 中添加一个简单的QProgressDialog进度对话框到一个名为QgsOgrProvider::extent()function ,它可以有更长的计算时间。

当我试图通过将#include <QProgressDialog>添加到 include 和

QProgressDialog progress(tr("Calculating extent.."), QString(), 0, 100);
progress.setWindowModality(Qt::WindowModal);
progress.setValue(30);
progress.setWindowTitle( tr( "Progress Indication" ) );
progress.setAutoClose( true );
progress.setMinimumDuration( 0 );
progress.setLabelText("Labeltext");

到 function 它编译和链接没有任何问题但是在执行代码时我只在应该显示进度对话框的那一刻得到一个黑框。 在此处输入图像描述

根据 QT QDialog 描述QObject 描述,我知道不一定需要提供父窗口小部件,但最好这样做,因为窗口小部件将位于父窗口的中心,并且完成后会自动销毁. 在 QGIS 项目的其他示例中,我注意到传递了一个parent项,一个nullptr或一个this object。为什么它不能与nullptr一起使用,我如何找到一个父项或创建一个可以传递给 function 的父项如果有必要?

我终于发现了一切。 这些是我的发现:

  • QProgressDialog可以在没有父对象的情况下使用
  • 仅当progress.setMinimumDuration( 0 )后跟progress.setValue(...)调用和QApplication::processEvents()调用时,黑色小部件才会填充内容。 这可能是因为只有progress.setValue()触发小部件为 output 做好准备,然后QApplication::processEvents()触发最后的 output:
    progress.setMinimumDuration( 0 );
    progress.setValue(...);
    QApplication::processEvents();
  • 要将QProgressDialog与 QGIS 主 window 作为父级一起使用,可以通过qApp->topLevelWidgets()访问小部件对象名称“QgisApp”(示例取自QgsGml::getFeatures()

     //find out if there is a QGIS main window. If yes, display a progress dialog QProgressDialog *progressDialog = nullptr; QWidget *mainWindow = nullptr; const QWidgetList topLevelWidgets = qApp->topLevelWidgets(); for ( QWidgetList::const_iterator it = topLevelWidgets.constBegin(); it.= topLevelWidgets;constEnd(); ++it ) { if ( ( *it )->objectName() == QLatin1String( "QgisApp" ) ) { mainWindow = *it; break. } } if ( mainWindow ) { progressDialog = new QProgressDialog(..; ). ... }

更新

  • 如果再次设置初始最小值,进度条将保持黑色,例如
    progressDialog = new QProgressDialog("Calculating .."), "Abort", 0, max);
    progress.setValue(0);
    QApplication::processEvents();
  • progressDialog->show()引发 window,即使通过progressDialog->setMinimumDuration( 2000 )设置了最短持续时间,但 window 保持黑色
  • 在 minimumDuration 时间之后,必须设置进度值才能显示进度 window
  • 当在设置值之前调用QApplication::processEvents()时,window 显示为黑色
  • progressDialog->setValue(...)显示为黑色,直到跟随QApplication::processEvents()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM