在Qt桌面应用程序中显示主窗体后执行操作

时间:2015-02-11 15:52:37

标签: c++ forms qt show

在Delphi中,我经常为主表单创建一个OnAfterShow事件。表单的标准OnShow()只有postmessage(),但会导致OnafterShow方法执行。

我这样做是为了有时冗长的数据加载或初始化不会停止正常加载和显示主窗体。

我希望在Qt应用程序中执行类似的操作,该应用程序将在Linux或Windows桌面计算机上运行。

我有什么方法可以做到这一点?

2 个答案:

答案 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;
}