在 Delphi 中,我经常为主窗体制作一个
OnAfterShow
事件。 表单的标准 OnShow()
只有一个 postmessage()
,这会导致执行 OnafterShow
方法。
我这样做是为了有时冗长的数据加载或初始化不会停止主窗体的正常加载和显示。
我想在 Qt 应用程序中做类似的事情,该应用程序将在 Linux 或 Windows 桌面计算机上运行。
我可以通过哪些方式来做到这一点?
您可以覆盖窗口的
showEvent()
并使用单次定时器调用您想要调用的函数:
void MyWidget::showEvent(QShowEvent *)
{
QTimer::singleShot(50, this, SLOT(doWork()));
}
这样当窗口即将显示时,
showEvent
被触发,doWork
插槽将在显示后的一小段时间内被调用。
您还可以覆盖小部件中的
eventFilter
并检查 QEvent::Show
事件:
bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{
if(obj == this && event->type() == QEvent::Show)
{
QTimer::singleShot(50, this, SLOT(doWork());
}
return false;
}
使用事件过滤器方法时,您还应该通过以下方式在构造函数中安装事件过滤器:
this->installEventFilter(this);
我使用 Paint 事件在没有计时器的情况下解决了这个问题。至少在 Windows 上对我有用。
// MainWindow.h
class MainWindow : public QMainWindow
{
...
bool event(QEvent *event) override;
void functionAfterShown();
...
bool functionAfterShownCalled = false;
...
}
// MainWindow.cpp
bool MainWindow::event(QEvent *event)
{
const bool ret_val = QMainWindow::event(event);
if(!functionAfterShownCalled && event->type() == QEvent::Paint)
{
functionAfterShown();
functionAfterShownCalled = true;
}
return ret_val;
}