Подтвердить что ты не робот

Возможно ли излучать сигнал Qt из метода const?

В частности, я реализую QWizardPage ( "MyWizardPage" ) для QWizard, и я хочу выпустить сигнал ( "sigLog" ) из моего переопределения виртуального метода QWizardPage:: nextId.

Так же:

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 &'

4b9b3361

Ответ 1

Можно излучать сигнал из метода const путем добавления "const" к объявлению сигнала, например:

void sigLog(QString text) const;

Я тестировал это, и он делает компиляцию и запуск, даже если вы фактически не реализуете сигнал как обычный метод самостоятельно (т.е. Qt в порядке с ним).

Ответ 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 - это взлом, но он намного короче:)