带有枚举参数的QObject :: connect()

时间:2012-02-07 16:05:31

标签: c++ qt

我正在尝试将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");

我仍然收到警告信息。 This related thread没有解决我的问题。我做错了什么?

2 个答案:

答案 0 :(得分:2)

我相信如果您只是在连接的SIGNAL部分中将ExceptionType更改为Calendar :: ExceptionType,它将解决问题。 moc期望SIGNAL和SLOT的字符串匹配。

答案 1 :(得分:0)

您需要与信号和插槽声明以及放在SIGNALSLOT宏中的内容保持一致。 moc不是一个完整的C ++编译器,它只是一个相对聪明的解析器。但最终信号和插槽名称只是字符串。

例如,这&#34;工作&#34;:

#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限定符,它也会有用。但是,如果你留下一些但是要删除其他人,它就会失败 因此,如果这些信号/插槽需要在您的课堂外可见/可访问,请限定所有名称。