能否在一个const方法中发出Qt信号?

40

具体来说,我正在为 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&'。

2个回答

64

通过在信号声明中添加“const”可以在const方法中发出信号,例如:

void sigLog(QString text) const;

我测试了一下,尽管您并没有将信号作为普通方法实现(即Qt可以接受),但它确实编译并运行了


1
我尝试过了,但是我无法连接到这样的信号。 - abhiarora
1
在Qt 6.2.4中工作正常。 - jvb

3

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

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,但它更简短 :)

感谢这个有趣的解决办法。我找到了更简单的解决方案(请参见我的答案),但否则我肯定会使用你的建议。 - DataGraham
是的,你的解决方案更好:))) - Raiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接