2011-04-25 12 views
29

En particular, estoy implementando una QWizardPage ("MyWizardPage") para un QWizard, y quiero emitir una señal ("sigLog") de mi anulación del método virtual QWizardPage :: nextId.¿Es posible emitir una señal Qt desde un método const?

así:

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

Pero cuando intento esto, me sale el siguiente error de compilación en la línea Q_EMIT:

de error 1 error C2662: 'MyWizardPage :: sigLog': no ​​se puede convertir este puntero de 'MyWizardPage const' a 'MyWizardPage &'

Respuesta

46

Es posible emitir una señal de una método const mediante la adición de "const" a la declaración de la señal, así:

void sigLog(QString text) const; 

he probado esto y que hace compilar y ejecutar, incluso si no implementa realmente la señal como un método normal usted mismo (es decir Qt está de acuerdo con eso).

+0

Lo intenté, pero no puedo conectarme a esas señales. – abhiarora

2

Puede intentar crear otra clase, declarará como para su amigo página del asistente y agregar al asistente como miembro mutable. después de eso, puedes emitir su señal en lugar de la de Wizard.

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

o es posible que sólo utiliza

int MyWizardPage::nextId() const 
{ 
    Q_EMIT const_cast<MyWizardPage*>(this)->sigLog("Something interesting happened"); 
} 

que no se forma recomendada, porque const_cast es un truco, pero es mucho más corto :)

+0

Gracias por la interesante solución. Encontré una solución más simple (ver mi respuesta), pero definitivamente usaría tu sugerencia de lo contrario. – DataGraham

+0

Sí, su solución es mejor :))) – Raiv

Cuestiones relacionadas