Est-il possible d'émettre un signal Qt à partir d'une méthode const?
En particulier, j'implémente une QWizardPage ("MyWizardPage") pour un QWizard, et je veux émettre un signal ("sigLog") de mon remplacement de la méthode virtuelle QWizardPage::nextId.
Comme ceci:
class MyWizardPage
: public QWizardPage
{
Q_OBJECT
public:
MyWizardPage();
virtual int nextId() const;
Q_SIGNALS:
void sigLog(QString text);
};
int MyWizardPage::nextId() const
{
Q_EMIT sigLog("Something interesting happened");
}
Mais quand j'essaie ceci, j'obtiens l'erreur de compilation suivante sur la ligne Q_EMIT:
Erreur 1 erreur c2662: 'MyWizardPage:: sigLog': impossible de convertir' ce 'pointeur de' const MyWizardPage ' en 'MyWizardPage &'
2 réponses
Il est possible d'émettre un signal à partir d'une méthode const en ajoutant "const" à la déclaration de signal, comme ceci:
void sigLog(QString text) const;
J'ai testé ceci et compile et exécute, même si vous n'implémentez pas vous-même le signal comme méthode normale (c'est-à-dire que Qt est d'accord avec cela).
Vous pouvez essayer de créer une autre classe , la déclarer comme ami pour votre page d'assistant et l'ajouter à l'assistant en tant que membre mutable. après cela, vous pouvez émettre son signal au lieu de celui de l'assistant.
class ConstEmitter: public QObject
{
Q_OBJECT
...
friend class MyWizardPage;
Q_SIGNALS:
void sigLog(QString text);
};
class MyWizardPage
: public QWizardPage
{
Q_OBJECT
public:
MyWizardPage();
protected:
mutable CostEmitter m_emitter;
Q_SIGNALS:
void sigLog(QString text);
};
int MyWizardPage::nextId() const
{
Q_EMIT m_emitter.sigLog("Something interesting happened");
}
MyWizardPage::MyWizardPage()
{
connect(&m_emitter,SIGNAL(sigLog(QString)),this,SIGNAL(sigLog(QString)));
}
Ou vous pouvez simplement utiliser
int MyWizardPage::nextId() const
{
Q_EMIT const_cast<MyWizardPage*>(this)->sigLog("Something interesting happened");
}
Ce n'est pas recommandé, car const_cast est un hack, mais c'est beaucoup plus court:)