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

QObject::connect() with enum parameters

本文关键字:connect QObject 枚举 参数      更新时间:2023-10-16

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

我仍然收到警告信息。这个相关的线索并没有解决我的问题。我做错了什么?

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

您需要与信号和插槽声明以及SIGNALSLOT宏中的内容保持一致。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); }
};

如果删除所有MyEnumA::限定符,也会起作用。但如果你留下一些,但去掉其他,它就会失败
因此,如果这些信号/插槽需要在类外可见/可访问,则对所有名称进行限定。