C++ Qt/C++;-从派生类调用重写的方法

C++ Qt/C++;-从派生类调用重写的方法,c++,qt,overriding,C++,Qt,Overriding,我有以下代码: 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)

我有以下代码:

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);
}
使用app强调主窗口的派生类

我想在“restoreInitialConfig”方法中调用基类MainWindow的closeEvent方法,以便在恢复配置后关闭窗口。 可能吗?这与我看到的其他问题不同,因为方法closeEvent在AppMpasse类中被重写

AppPase类:

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;
提前谢谢


Flo

有一种更简单的方法来实现您想要做的事情,而不必使用信号和插槽,也不必从插槽调用基类函数

可以直接从
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);
}
然后,您可以从
closeEvent
处理程序中直接调用
restoreInitialConfig
,因为您知道按下了哪个按钮

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
功能,因为不需要检查按钮文本,您知道答案是肯定的


注意,我也利用了这一点,很容易创建简单的消息框。

你可能想看看C++中如何使用一个等价的“超级”。有关更多信息,请参阅此讨论。您根本不必调用
closeEvent()
函数。继承
QMainWindow
类时,只需调用其
close()
插槽即可将其关闭。因此,不是
MainWindow::closeEvent(closeEvent)close()。请注意,我们喜欢一个,即复制问题的代码的最小版本。这使你的问题更容易回答,对其他有同样问题的人更有用。