我有一个程序,它接受一个命令行参数(要加载的文件)。如果在加载文件时出现问题,则会显示QMessageBox
。它没有正确放置(不以MainWindow
为中心),很可能是因为调用加载函数时show()
进程尚未完成。
我在main.cpp
MainWindow mainWindow;
mainWindow.show();
QStringList arguments = QCoreApplication::arguments();
if (arguments.count() > 1) {
mainWindow.loadTournament(arguments[1]);
}
return app.exec();
然后我尝试添加
QApplication::processEvents();
在加载函数调用之前,但它没有改变任何东西。
我也尝试添加
QStringList arguments = QCoreApplication::arguments();
if (arguments.count() > 1) {
loadTournament(arguments[1]);
}
到主窗口的构造函数的末尾,但行为完全相同,之前也是QApplication::processEvents();
。
然后我尝试使用QTimer
,并将以下代码添加到构造函数的末尾:
QTimer::singleShot(0, this, &MainWindow::checkLoadTournament);
和
void MainWindow::checkLoadTournament()
{
QStringList arguments = QCoreApplication::arguments();
if (arguments.count() > 1) {
loadTournament(arguments[1]);
}
}
加入。这也会产生QMessageBox
的错误放置。
如果我增加QTimer
等待值(例如100 msecs),它就可以了。但这对我来说似乎有些苛刻,因为我无法确定主窗口是否在这段时间内实际显示。
有没有办法知道主窗口显示和放置是否已完成并正确完成并等待显示QMessageBox
之前完成此操作或将其放置在正确的位置之前?
编辑:这是SSCCE:
main.cpp中:
#include "MainWindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWindow;
mainWindow.show();
mainWindow.loadTournament();
return app.exec();
}
MainWindow.h:
#include <QMainWindow>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow();
void loadTournament();
};
MainWindow.cpp:
#include "MainWindow.h"
#include <QMessageBox>
MainWindow::MainWindow()
{
resize(900, 700);
}
void MainWindow::loadTournament()
{
QMessageBox::critical(this, tr("foo"), tr("bar"), QMessageBox::Ok);
}
消息框不会出现在主窗口的中心。取决于我将控制台窗口放在从哪里开始(并放置主窗口),差异可能非常大。