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

时间:2011-04-25 18:04:43

标签: qt signals-slots

特别是,我正在为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 个答案:

答案 0 :(得分:52)

可以通过在信号声明中添加“const”来从const方法发出信号,如下所示:

void sigLog(QString text) const;

我对此进行了测试,并且确实编译并运行,即使您实际上并没有将信号作为常规方法实现(即Qt可以使用它)。

答案 1 :(得分: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)));
}

或者您可以使用

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

这是不推荐的方式,因为const_cast是一个hack,但它更短:)