QObject :: connect () с параметрами перечисления - PullRequest
1 голос
/ 07 февраля 2012

Я пытаюсь использовать QObject::connect() с параметрами перечисления. Я получил это сообщение ...

QObject::connect: Incompatible sender/receiver arguments
        Calendar::calendarExceptionThrown(Calendar*,ExceptionType)
   --> CalendarDBView::handleCalendarException(Calendar*,Calendar::ExceptionType)

Код подключения:

 connect(cal, SIGNAL(calendarExceptionThrown(Calendar*,ExceptionType)),
         this, SLOT(handleCalendarException(Calendar*,Calendar::ExceptionType)));

Из того, что я прочитал, я решил, что мне нужно добавить это к определению класса Calendar:

Q_ENUMS(ExceptionType)

Я добавил это к main.cpp:

qRegisterMetaType<Calendar::ExceptionType>("ExceptionType");

Я все еще получаю предупреждение. Эта связанная тема не решила мою проблему. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Я полагаю, что если вы просто измените ExceptionType на Calendar :: ExceptionType в части SIGNAL вашего соединения, это решит проблему. moc ожидает совпадения строк для SIGNAL и SLOT.

0 голосов
/ 07 февраля 2012

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

Например, это «работает»:

#include <QtCore>

class A: public QObject {
    Q_OBJECT

    public:
        enum MyEnum { e0 };

    public:
        A(QObject *parent=0): QObject(parent) {
            connect(this, SIGNAL(fire(A::MyEnum)), this, SLOT(foo(A::MyEnum)));
        }

    public slots:
        void foo(A::MyEnum) {
            qDebug() << "In slot A::foo()";
        }
    signals:
        void fire(A::MyEnum);
    public:
        void test() { emit fire(e0); }
};

Это также будет работать, если вы удалите все квалификаторы A:: для MyEnum. Но это не удастся, если вы оставите некоторые, но удалите другие.
Поэтому уточните все имена, если эти сигналы / слоты должны быть видны / доступны за пределами вашего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...