2015-08-18 1 views
-1

J'utilise QT creator pour créer le formulaire Ui. J'ai un formulaire de base qui contient 5 boutons (testListForm). J'hérite cette classe de base dans ma classe dérivée (DisplayTestResultsForm) via TestStatusForm. quand je clique sur le bouton dans la classe dérivée, la fonction on_pushbutton_1_clicked() est appelée trois fois. ci-dessous est le extrait de codeLe bouton est appelé plusieurs fois avec plusieurs héritages dans QT

class TestListForm : public TestBaseForm 
{ 
    Q_OBJECT 

private slots: 
    virtual void on_pushButton_1_clicked(); 
    virtual void on_pushButton_2_clicked(); 
    virtual void on_pushButton_3_clicked(); 
    virtual void on_pushButton_4_clicked(); 
    virtual void on_pushButton_5_clicked(); 
} 

class TestStatusForm : public TestListForm 
{ 
    Q_OBJECT 
    .... 
}; 

class DisplayTestResultsForm : public TestStatusForm 
{ 
    Q_OBJECT 

private slots: 
    void on_pushButton_1_clicked(); 
    void on_pushButton_2_clicked(); 
    void on_pushButton_3_clicked(); 
    void on_pushButton_4_clicked(); 
    void on_pushButton_5_clicked(); 
} 

Quand j'appelle on_pushButton_1_clicked dans DisplayTestResultsForm, je reçois cette fonction s'appelle trois fois. Je ne fais aucun appel de connexion explicite car Ui s'en chargera en utilisant ConnectSlotByName. Quelqu'un peut-il suggérer quel pourrait être le problème?

Merci d'avance.

+0

Il est probable qu'il est en quelque sorte connecté deux fois. – user3528438

+0

comment vérifier si elle est connectée deux fois ou non? Si oui, comment l'enlever? – user3744269

+0

Postez votre code avec l'appel à ConnectSlotByName(). – kh25

Répondre

0

Il y a deux erreurs:

  1. fentes privées sont locales. Il ne sert à rien de les rendre virtuels, car aucune classe dérivée ne les voit. Vous devez faire les emplacements protégés.

  2. Lorsque vous avez emplacements virtuels, vous ne devez les déclarer à mocune fois. La macro slots est vide et n'a de signification que pour l'outil moc. La classe la plus basique qui déclare les slots devrait les déclarer comme slots. Tous les des classes dérivées doivent pas les déclarer comme emplacements, mais simplement comme Q_DECL_OVERRIDE réimplémentations.

Ainsi:

class TestListForm : public TestBaseForm 
{ 
    Q_OBJECT 
protected slots: // protected, not private 
    virtual void on_pushButton_1_clicked(); 
    virtual void on_pushButton_2_clicked(); 
    virtual void on_pushButton_3_clicked(); 
    virtual void on_pushButton_4_clicked(); 
    virtual void on_pushButton_5_clicked(); 
} 

class TestStatusForm : public TestListForm 
{ 
    Q_OBJECT 
protected: // protected, overriden, no slots macro 
    void on_pushButton_1_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_2_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_3_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_4_clicked() Q_DECL_OVERRIDE; 
    void on_pushButton_5_clicked() Q_DECL_OVERRIDE; 
} 
+0

Salut kuba, Merci pour votre suggestion. Oui, les emplacements virtuels ne doivent pas être privés. mon erreur. J'ai incorporé vos suggestions et maintenant je reçois cette fonction appelée deux fois. Dans le fichier moc je pourrais voir une seule fois dans la classe de base comme ci-dessous moc_testlistform.cpp: 40: "TestListForm \ 0on_pushButton_1_clicked \ 0" moc_testlistform.cpp: 82: cas 0: _t-> on_pushButton_1_clicked(); Pause; – user3744269

+0

@ user3744269 Je pense que vous êtes tombé en proie à ne pas fournir assez de code, car avec les changements décrits ci-dessus le code est parfaitement bien ** et fonctionne bien **. Je pense que je sais ce que tu fais. La méthode 'Ui :: setupUi' configure les connexions pour vous en appelant' QMetaObject :: connectSlotsByName'. Si vous appelez 'Ui: setupUi' dans l'une des classes de base, puis une autre dans une classe dérivée, vous obtiendrez ce comportement. Est-ce le cas? Si c'est le cas, rappelez-vous que si vous ne fournissez pas un cas de test autonome, vous vous tirerez dans le pied et perdrez du temps pour tout le monde - le tien aussi. –

+0

Merci beaucoup de m'avoir montré le pointeur. Tu as raison. setupUi était également appelé dans la classe dérivée. Après avoir supprimé setupUi dans la classe dérivée, cela a fonctionné comme prévu. Qt est très nouveau pour moi. ces questions seront de nouveaux apprentissages. Si j'avais su cela, je n'aurais pas dû faire cette erreur. merci encore pour avoir résolu mon problème. – user3744269