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 &'

30
demandé sur DataGraham 2011-04-25 22:04:43

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).

49
répondu DataGraham 2011-04-26 12:32:23

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:)

2
répondu Raiv 2011-04-26 15:41:39