Qt / C ++ - 从派生类调用overriden方法

时间:2017-06-16 08:51:54

标签: c++ qt override

我有以下代码:

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

使用AppMPhase MainWindow的派生类

我想在" restoreInitialConfig"中调用基类MainWindow的closeEvent方法。方法,在我们恢复配置后关闭窗口。 可能吗 ?它与我看到的其他问题有所不同,因为在AppMPhase类中覆盖了closeEvent方法。

AppMPhase类:

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;

MainWindow类:

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;
        };

提前致谢。

弗洛

1 个答案:

答案 0 :(得分:0)

有一种更简单的方法可以实现您想要做的事情,而无需使用信号和插槽,并从您的插槽中调用基类功能。

可以直接从closeEvent处理程序中执行恢复。

这是因为QMessageBox::exec返回的整数代码与StandardButton enum中的一个值匹配,这取决于按下了什么按钮。

然后,您可以直接从restoreInitialConfig处理程序中调用closeEvent,因为您知道按下了哪个按钮。

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

请注意,这也简化了您的restoreInitialConfig功能,因为无需检查按钮文本,您知道答案是肯定的。

另请注意,我使用了this QMessageBox constructor,这使得创建简单的消息框非常容易。