Возможно ли излучать сигнал 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 &'
Ответы
Ответ 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 - это взлом, но он намного короче:)