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

前端 未结 2 2025
北荒
北荒 2021-01-14 16:12

In Delphi I often made an OnAfterShow event for the main form. The standard OnShow() for the form would have little but a postmessage()

相关标签:
2条回答
  • 2021-01-14 17:00

    I solved it without a timer using Paint event. Works for me at least on 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;
    }
    
    0 讨论(0)
  • 2021-01-14 17:02

    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);
    
    0 讨论(0)
提交回复
热议问题