Michael Vincent Michael Vincent - 2 months ago 8
C++ Question

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

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?

Answer

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);
Comments