2017-06-16 3 views
2

je dérivé le code suivant:Qt/C++ - Appel de la méthode surchargée de la classe

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

avec AppMPhase la classe dérivée de MainWindow

Je voudrais appeler la méthode closeEvent de la classe de base MainWindow dans la méthode "restoreInitialConfig", pour fermer la fenêtre après avoir restauré la configuration. Est-ce possible? c'est différent des autres questions que j'ai vues car la méthode closeEvent est surchargée dans la classe AppMPhase.

la classe 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; 

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

Merci à l'avance.

Flo

+0

Vous pourriez vouloir voir comment vous pourriez utiliser un équivalent de "super" en C++. Voir cette discographie pour plus d'informations. – Xatyrian

+1

Vous n'avez pas à appeler la fonction 'closeEvent()' du tout. Lorsque vous héritez de la classe 'QMainWindow', vous pouvez simplement appeler son emplacement' close() 'pour le fermer. Ainsi, au lieu de 'MainWindow :: closeEvent (closeEvent);' dans votre code, appelez 'close();'. – vahancho

+0

Notez que nous aimons un [MCVE], c'est-à-dire une version minimale de votre code qui reproduit votre problème. Cela rend votre question plus facile à répondre et plus utile pour les autres avec la même question. – m7913d

Répondre

0

Il est un moyen d'atteindre beaucoup plus facile ce que vous êtes désireux de faire, sans avoir à utiliser les signaux et les machines à sous, et appeler des fonctions de classe de base de votre emplacement.

Il est possible d'effectuer la restauration directement depuis votre gestionnaire closeEvent.

Ceci est rendu possible par le fait que QMessageBox::exec renvoie un code entier qui correspond à l'une des valeurs du StandardButton enum, en fonction du bouton enfoncé.

Cela vous permet ensuite d'appeler restoreInitialConfig directement à partir de votre gestionnaire closeEvent, car vous savez quel bouton a été enfoncé.

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

Notez que cela simplifie également votre fonction restoreInitialConfig, car il n'y a pas besoin de vérifier le texte du bouton, vous savez la réponse était oui.

Notez également que j'ai fait usage de this QMessageBox constructor ce qui rend très simple la création de boîtes de message simples.