开发者

Is it possible to emit a Qt signal from a const method?

开发者 https://www.devze.com 2023-03-01 02:35 出处:网络
In particular, I am implementing a QWizardPage (\"MyWizardPage\") for a QWizard, and I want to emit a signal (\"sigLog\") from my override of the QWizardPage::nextId virtual method.

In particular, I am implementing a QWizardPage ("MyWizardPage") for a QWizard, and I want to emit a signal ("sigLog") from my override of the QWizardPage::nextId virtual method.

Like so:

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

But when I try this, I get the following compile error on the Q_EMIT line:

Error 1 error C2662: 'MyWizardPage::sigLog' : cannot convert 'this' pointer from 'const MyWizardPage' to 'MyWizardPage &'


It is possible to emit a signal from a const method by adding "const" to the signal declaration, like so:

void sigLog(QString text) const;

I tested this and it does compile and run, even though you don't actually implement the signal as a normal method yourself (i.e. Qt is okay with it).


You may try to create another class , declare it as friend for your wizard page and add to wizard as a mutable member. after that you may emit it's signal instead of wizard's.

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

or you may just use

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

that is not recommended way, because const_cast is a hack, but it's much shorter :)

0

精彩评论

暂无评论...
验证码 换一张
取 消