这可能有点过时了,但因为除了这个之外没有其他人回答它:
由于没有“显示”信号,我建议像这样覆盖显示事件:
在您的 mainwindow.cpp 文件中:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
}
在您的 mainwindow.h 文件中,在 MainWindow 的声明中:
...
class MainWindow: public QMainWindow
{
...
signals:
void windowShown();
...
}
...
然后,当您转到设计器时,右键单击主窗口(对象树的最顶部),然后选择“更改信号/插槽”。在“信号”框架中,单击“+”按钮,您需要添加“windowShown()”,然后按回车,然后单击“确定”按钮(注意省略号“...”表示其他代码已经在您的标题中)。
就是这样——您现在可以随时使用信号/插槽编辑器将插槽链接到“windowShown”信号。现在,如果您想要更像微软的“加载”事件,我认为它在 .NET 中使用,您将需要创建一些实例变量并标记它,以便每次显示窗口时都不会发出它,例如:
void MainWindow::show()
{
QMainWindow::show();
QApplication::processEvents();
emit windowShown();
if (firstTimeShown == true)
{
emit windowLoaded();
firstTimeShown = false;
}
}
另外,不要忘记在构造函数中将变量初始化为“true”:
MainWindow::MainWindow(QObject* parent)
...
{
firstTimeShown = true; // put this somewhere before ui->setupUi()
}
但是,如果您决定将它放在初始化列表中,请确保它的顺序正确。如果变量没有按照类头文件中声明的从上到下的方式实例化,编译器会报错。
现在,请确保在标题中定义 firstTimeShown 时,将其设为私有。并且不要忘记添加的信号:
class MainWindow : public QMainWindow
{
...
signals:
void windowLoaded();
void windowShown();
private:
bool firstTimeShown;
...
就是这样。借助信号和插槽的灵活性,它可以很容易地模仿您可能从 Windows 窗体或 MFC 中找到的任何事件。程序员只需要一点点努力。一旦你掌握了它的窍门,它就会成为第二天性。
注意:可能有 优化或更精确的方法来执行“已加载”和“已显示”信号,但为了简单起见,我已将此类内容排除在外。回到手头的问题,调用 QApplication::processEvents() 很可能是您想要做的,而不是等待固定的时间,因为谁知道如果用户正在运行其他 100 件事情需要多长时间最重要的是,等等等等。希望有所帮助,包括额外的解释,希望它可以为您提供更好的方法来做您想做的事情,而不是等待某事完成,“知道”它已经完成是一个更好的选择。