是否可以从const方法发出Qt信号?

问题描述:

特别是,我正在为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':不能将'this'指针从'const MyWizardPage'转换为'MyWizardPage'&'

它能够射出从信号const方法在信号声明中加入“const”,如下所示:

void sigLog(QString text) const; 

我测试了这个,它确实编译并运行,尽管你自己并没有像常规方法那样实际地实现信号(即, Qt是可以的)。

+0

我试过了,但我无法连接到这样的信号。 – abhiarora 2017-11-26 14:42:48

您可以尝试创建另一个类,将其声明为您的朋友向导页面,并添加到向导作为一个可变成员。之后你可能会发出信号而不是向导。

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

,或者你可以只使用

int MyWizardPage::nextId() const 
{ 
    Q_EMIT const_cast<MyWizardPage*>(this)->sigLog("Something interesting happened"); 
} 
是不推荐的方式

,因为const_cast会是一个黑客,但它的短得多:)

+0

感谢您的有趣解决方法。我找到了更简单的解决方案(请参阅我的答案),但我肯定会使用您的建议,否则。 – DataGraham 2011-04-26 12:34:23

+0

是的,你的解决方案是更好:))) – Raiv 2011-04-26 12:51:36