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

Take action after the main form is shown in a Qt desktop application

在Delphi我经常为主窗体做一个OnAfterShow事件。表单的标准 OnShow() 几乎没有,只有 postmessage() 会导致执行 OnafterShow 方法。

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

我想在 Qt 应用程序中做一些类似的事情,它将 运行 在桌面计算机上 Linux 或 Windows。

我有哪些方法可以做到这一点?

您可以覆盖 window 的 showEvent() 并使用单次计时器调用您想要调用的函数:

void MyWidget::showEvent(QShowEvent *)
{
    QTimer::singleShot(50, this, SLOT(doWork());
}

这样当windows即将显示时,showEvent被触发,doWork显示后不久就会调用[=18] =]

您还可以覆盖小部件中的 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;
}