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

4
在Delphi中,我经常为主窗体设置一个OnAfterShow事件。标准的OnShow()方法只会执行一个postmessage(),从而导致OnAfterShow方法被执行。

我这样做是为了使一些耗时的数据加载或初始化不会阻止主窗体的正常加载和显示。
我想在一个Qt应用程序中实现类似的功能,该应用程序将在桌面电脑上运行,无论是Linux还是Windows。
有哪些可用的方法可以实现这一点?
2个回答

10

你可以重载窗口的 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);

谢谢Nejat。阅读文档(在这里:http://qt-project.org/doc/qt-4.8/qwidget.html#showEvent),似乎事件会在窗口首次显示之前发生。我是对的吗?我想在窗口首次显示后进行操作。 - Michael Vincent
是的,它将在窗口显示之前被调用。您可以使用单次定时器在小部件显示后调用函数。我已经更新了答案。 - Nejat
实际上,在小部件显示之前,会传递非自发事件。例如,当您以编程方式调用“show”时。 - Nejat
这个方法很有效,即使是非常小的时间间隔也可以。谢谢。虽然对于这样的事情使用定时器似乎有些不妥,但这是我迄今找到的唯一可行方式。 - Michael Vincent
1
我也尝试过寻找如何实现完全相同的目标,但在我尝试的所有解决方案中,只有这个“QTimer”黑科技起作用。如果有人知道如何以“正确”的方式做到这一点,将不胜感激。 - Neurotransmitter

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

狡猾的。谢谢。 - Michael Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接