是否可以从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是可以的)。
您可以尝试创建另一个类,将其声明为您的朋友向导页面,并添加到向导作为一个可变成员。之后你可能会发出信号而不是向导。
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会是一个黑客,但它的短得多:)
感谢您的有趣解决方法。我找到了更简单的解决方案(请参阅我的答案),但我肯定会使用您的建议,否则。 – DataGraham 2011-04-26 12:34:23
是的,你的解决方案是更好:))) – Raiv 2011-04-26 12:51:36
我试过了,但我无法连接到这样的信号。 – abhiarora 2017-11-26 14:42:48