Можно ли излучать сигнал Qt из метода const? - PullRequest
31 голосов
/ 25 апреля 2011

В частности, я реализую 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 &»

Ответы [ 2 ]

52 голосов
/ 26 апреля 2011

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

void sigLog(QString text) const;

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

2 голосов
/ 26 апреля 2011

Вы можете попытаться создать другой класс, объявить его своим другом на странице мастера и добавить в мастер как изменяемый член.после этого вы можете испустить его сигнал вместо волшебника.

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

...