更新时间:2023-10-14 09:54:46
您可以覆写 $ b
c> 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);
In Delphi I often made an OnAfterShow
event for the main form. The standard OnShow()
for the form would have little but a postmessage()
which would cause the OnafterShow
method to be executed.
I did this so that sometimes lengthy data loading or initializations would not stop the normal loading and showing of the main form.
I'd like to do something similar in a Qt application that will run on a desktop computer either Linux or Windows.
What ways are available to me to do this?
You can override showEvent()
of the window and call the function you want to be called with a single shot timer :
void MyWidget::showEvent(QShowEvent *)
{
QTimer::singleShot(50, this, SLOT(doWork());
}
This way when the windows is about to be shown, showEvent
is triggered and the doWork
slot would be called within a small time after it is shown.
You can also override the eventFilter
in your widget and check for QEvent::Show
event :
bool MyWidget::eventFilter(QObject * obj, QEvent * event)
{
if(obj == this && event->type() == QEvent::Show)
{
QTimer::singleShot(50, this, SLOT(doWork());
}
return false;
}
When using event filter approach, you should also install the event filter in the constructor by:
this->installEventFilter(this);