[英]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 保持黑色QApplication::processEvents()
时,window 显示为黑色progressDialog->setValue(...)
显示为黑色,直到跟随QApplication::processEvents()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.