2017-10-17 16 views
0

J'ai un QWizardPage où l'utilisateur est censé passer par certaines étapes, à la fin de laquelle il y a un bouton "Test". Si l'utilisateur appuie sur ce bouton, deux choses se produisent:QWizardPage: comment désactiver le bouton "Suivant"

  1. bouton « Suivant » s'activé pour pouvoir aller à la page suivante du QWizard. Ceci est réalisé par l'émission d'un signal spécial d'un bouton qui est relié à QWizardPage:

    this->registerField("test*", m_button, "text", SIGNAL(testDone()));

m_button est dérivé d'QPushButton avec un signal personnalisé testDone().

  1. Le nom du bouton est modifié en "Réessayer" afin d'offrir une option pour réessayer la série d'étapes. Si l'utilisateur appuie sur le bouton, les éléments de l'interface graphique reviennent à l'état initial (sauf que la désactivation du bouton "Suivant" sur QWizard).

La question est: pour le deuxième scénario, comment puis-je faire que le bouton « Suivant » se désactivé après avoir été validé par le signal émis testDone()?

Je pensais que si je déconnecte le signal particulier testDone() de QwizardPage (après il est émis), il donnerait les résultats souhaités, mais cela n'a pas fonctionné. J'ai essayé de tout déconnecter sur le (par exemple this->disconnect), mais cela ne fonctionnait pas non plus. D'autres idées?

Répondre

1

Pour contrôler les pages "readyness", vous remplacez généralement QWizardPage::isComplete et les changements de signal via QWizardPage::completeChanged.

Donc, pour votre exemple, vous pouvez donner à votre bouton une propriété et connectez-vous en conséquence:

class MyButton : public QPushButton 
{ 
    Q_OBJECT 

    Q_PROPERTY(bool ready READ isReady NOTIFY readyChanged) 

public: 
    MyButton(QWidget *parent); 
    bool isReady() const; 

signals: 
    void readyChanged(); 
}; 

Chaque fois que le bouton est pressé ou les tests effectués, émettre le signal, et retourner l'état du bouton désiré de la Fonction isReady

Dans votre page de l'assistant, passer outre isComplete comme:

bool isComplete() const { 
    return QWizardPage::isComplete() && myButton->isReady(); 
} 

et connecter les signaux dans votre page:

connect(myButton, &MyButton::readyChanged, this, &MyPage::completeChanged); 
+0

qui fonctionne, merci! Il était également utile de savoir comment utiliser Q_PROPERTY dans ce contexte. – vicrucann