2011-04-25 5 views
29

특히 QWizard 용 QWizardPage ("MyWizardPage")를 구현 중이고 QWizardPage :: nextId 가상 메서드의 재정의에서 신호 ("sigLog")를 내보내려고합니다.const 메서드에서 Qt 신호를 내보낼 수 있습니까?

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

하지만이 때, 나는 Q_EMIT 줄에 다음 컴파일 오류 얻을 :

과 같이

오류 1 오류 C2662 : 'MyWizardPage :: sigLog에게'할 수 없습니다 'MyWizardPage &'에 'const를 MyWizardPage'에서 '이'포인터를 변환

당신은 다른 클래스를 만들려고 위해 친구를 선언 할 수있다

답변

46

에서 신호를 방출 할 수 있습니다 const 메서드를 "const"를 신호 선언에 추가하여 다음과 같이합니다.

void sigLog(QString text) const; 

테스트 한 결과 으로 컴파일되고 실행됩니다. 실제로 신호를 정상적인 방법으로 구현하지 않아도됩니다 (예 : Qt는 괜찮습니다.)

+0

시도했지만 그러한 신호에 연결할 수 없습니다. – abhiarora

2

당신의 마법사 페이지를 열고 변경 가능한 멤버로 마법사에 추가하십시오. 그 후에 마법사의 신호 대신에 신호를 낼 수 있습니다.

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

나에 const_cast가 해킹이지만 :) 훨씬 짧은 때문에 당신은, 방법을 사용하지 않는 것이 좋습니다

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

을 사용할 수 있습니다

+0

흥미로운 해결책을 제공해 주셔서 감사합니다. 나는 더 간단한 해결책을 찾았지만 (내 대답을 보라), 그렇지 않으면 분명히 당신의 제안을 사용할 것이다. – DataGraham

+0

예, 당신의 해결책은 더 좋습니다 :))) – Raiv

관련 문제