我正在尝试将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没有解决我的问题。我做错了什么?
答案 0 :(得分:2)
我相信如果您只是在连接的SIGNAL部分中将ExceptionType更改为Calendar :: ExceptionType,它将解决问题。 moc期望SIGNAL和SLOT的字符串匹配。
答案 1 :(得分:0)
您需要与信号和插槽声明以及放在SIGNAL
和SLOT
宏中的内容保持一致。 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
限定符,它也会有用。但是,如果你留下一些但是要删除其他人,它就会失败
因此,如果这些信号/插槽需要在您的课堂外可见/可访问,请限定所有名称。