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

| 特别是,我正在为QWizard实现QWizardPage(\“ MyWizardPage \”),并且我想从对QWizardPage :: nextId虚拟方法的覆盖中发出信号(\“ sigLog \”)。 像这样:
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是一个hack,但是要短得多:)     

要回复问题请先登录注册