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