Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt桌面应用程序中显示主窗体后执行操作_C++_Forms_Qt_Show - Fatal编程技术网

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

C++ 在Qt桌面应用程序中显示主窗体后执行操作,c++,forms,qt,show,C++,Forms,Qt,Show,在Delphi中,我经常为主窗体在aftershow上创建一个事件。表单的标准OnShow()只有一个postmessage(),这将导致执行OnafterShow方法 我这样做是为了,有时长时间的数据加载或初始化不会停止主窗体的正常加载和显示 我想在运行在Linux或Windows桌面计算机上的Qt应用程序中执行类似的操作 有什么方法可以做到这一点?您可以覆盖窗口的showEvent(),并使用单次触发计时器调用您想要调用的函数: void MyWidget::showEvent(QShowE

在Delphi中,我经常为主窗体在aftershow上创建一个
事件。表单的标准
OnShow()
只有一个
postmessage()
,这将导致执行
OnafterShow
方法

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

我想在运行在Linux或Windows桌面计算机上的Qt应用程序中执行类似的操作


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

您可以覆盖窗口的
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);

我用绘画事件解决了这个问题,没有定时器。至少在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;
}

谢谢你,内贾特。阅读文档(此处:)似乎事件将在(首先)显示窗口之前发生。我说得对吗?我想在第一次显示窗口后再做工作。是的,在显示窗口之前会调用它。显示小部件后,可以使用单次触发计时器调用函数。我已经更新了答案。事实上,非自发事件是在小部件显示之前交付的。例如,当您实用地调用
show
时,即使使用非常小的间隔值,也可以这样做。非常感谢。不过,用计时器来做这样的事情似乎是错误的。但这是迄今为止我发现的唯一有效的方法。我也试图找到如何实现完全相同的目标,但在所有的解决方案中,我只尝试了这个
QTimer
hack。如果有人知道如何正确地做这件事,我们将不胜感激。谢谢