Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

c++

forms

qt

show

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?

like image 718
Michael Vincent Avatar asked Sep 15 '25 02:09

Michael Vincent


1 Answers

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);
like image 125
Nejat Avatar answered Sep 16 '25 19:09

Nejat