在Delphi中,我经常为主表单创建一个OnAfterShow
事件。表单的标准OnShow()
只有postmessage()
,但会导致OnafterShow
方法执行。
我这样做是为了有时冗长的数据加载或初始化不会停止正常加载和显示主窗体。
我希望在Qt应用程序中执行类似的操作,该应用程序将在Linux或Windows桌面计算机上运行。
我有什么方法可以做到这一点?
答案 0 :(得分:7)
你可以覆盖窗口的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);
答案 1 :(得分:1)
我使用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;
}