flog
flog

Reputation: 21

Qt/C++ - Call of overriden method from derived class

I have the following code:

void AppMPhase::closeEvent(QCloseEvent *closeEvent) {
    QMessageBox* dialog = new QMessageBox(this);
    dialog->setText("Warning: Initial configuration changed\nDo you want to restore it ?");
    dialog->setIcon(QMessageBox::Warning);
    dialog->addButton(QMessageBox::Yes);
    dialog->addButton(QMessageBox::No);
    connect(dialog, SIGNAL(buttonClicked(QAbstractButton*)), this, SLOT(restoreInitialConfig(QAbstractButton*)));
    dialog->exec();
}


void AppMPhase::restoreInitialConfig(QAbstractButton *button) {
    if(!button->text().compare(QString("Yes"))) {
        // restore Config
    }
    else {
        // don't restore
    }
    MainWindow::closeEvent(closeEvent);
}

with AppMPhase the derived class of MainWindow

I would like to call the method closeEvent of the base class MainWindow in the "restoreInitialConfig" method, to close the window after we restore the config. Is it possible ? it's different from the other questions I have seen because the method closeEvent is overriden in the AppMPhase class.

the AppMPhase class:

class AppMPhase : public QtUi::MainWindow
        {
            Q_OBJECT

        public:
            AppMPhase(QWidget *const parent = Q_NULLPTR, const Qt::WindowFlags flags = 0);
            ~AppMPhase();
            int readConfigFromExternFile(QString path);
            int readCalibrationDate(QString path);

            QSize sizeHint() const Q_DECL_OVERRIDE;
            QtWrapperTestManager * testManager;

        public Q_SLOTS:
            void show();

        public slots:
            void currentTestFinished();
            void createTest(unsigned int,QString);
            void restoreInitialConfig(QAbstractButton* button);

        signals:
            void notifyPageTestCurrentTestFinished();

        private:
            enum AppPage
            {
                PAGE_START,
                PAGE_ABOUT
            };

            bool isTestMangaerCreated;
            std::map<QString, std::map<std::string, std::string> > conversion_Table_Cable_Ref_sensorParamMap;


            Pages::GenericAppPage * appPage(const int index) const;
            QToolButton    * appPageButton(const int index) const;
            virtual void closeEvent(QCloseEvent *closeEvent) Q_DECL_OVERRIDE;

The MainWindow class:

class SHARED_EXPORT_LIB_QT_UI MainWindow : public QMainWindow
        {
            Q_OBJECT

        signals:
            void aboutToClose();

        public slots:
            virtual void show();

        private slots:
            void changeLanguage(const QString &language);

        public:
            MainWindow(QWidget *const parent = Q_NULLPTR, const Qt::WindowFlags flags = 0);
            virtual ~MainWindow();

        protected:
            void showCopyright(const QString &copyRightHeader);
            void showLanguageSelector(const QStringList &languages);
            void setupUi(const MainPageList &pageList);
            void setupUi(QWidget *centerWidget = Q_NULLPTR);
            virtual void closeEvent(QCloseEvent *closeEvent) Q_DECL_OVERRIDE;

            const Ui::MainWindow *const _ui;
            MainPageItemList            _mainPageItemList;
        };

Thanks in advance.

Flo

Upvotes: 2

Views: 245

Answers (1)

Steve Lorimer
Steve Lorimer

Reputation: 28659

There is a far easier way to achieve what you're wanting to do, without having to use signals and slots, and call base class functions from your slot.

It is possible to do the restoration directly from within your closeEvent handler.

This is made possible by the fact that QMessageBox::exec returns an integer code which matches one of the values in the StandardButton enum, depending on what button was pressed.

That then allows you to call restoreInitialConfig directly from within your closeEvent handler, as you know which button was pressed.

void AppMPhase::closeEvent(QCloseEvent* ev) 
{
    int res = QMessageBox(
        QMessageBox::Icon::Warning,
        "Restore configuration?",
        "Warning: Initial configuration changed\nDo you want to restore it?",
        QMessageBox::Yes | QMessageBox::No,
        this).exec();

    if (res == QMessageBox::Yes)
        restoreInitialConfig();

    MainWindow::closeEvent(ev);
}

Note that this also simplifies your restoreInitialConfig function, as there is no need to check button text, you know the answer was yes.

Note also I made use of this QMessageBox constructor which makes it very easy to create simple message boxes.

Upvotes: 1

Related Questions