Qt Queued Slots 中的枚举和枚举 类

enums and enum classes in Qt Queued Slots

根据 Qt documentation and this question's answers 的建议,我的代码结构如下:

emulator.h:

class Emulator : public QObject
{
        Q_OBJECT

    public:
        enum HaltCause {
            Breakpoint,
            ReadWatch,
            WriteWatch,
            UserHalted,
            Reset,
            SingleStep,
        };

        Q_ENUM(HaltCause)
    ...
    signals:
        void emulationHalted(HaltCause cause);
    ...
};

我的 MainWindow class 有一个匹配的插槽:

    private slots:
        ...
        void onEmulationHalted(Emulator::HaltCause cause);

在mainwindow.cpp中,构造函数包含:

...
    qRegisterMetaType<Emulator::HaltCause>();
...

并在稍后在 MainWindow 中调用的方法中 class:

...
connect(m_emulator, &Emulator::emulationHalted, this, &MainWindow::onEmulationHalted);
...

模拟器 class 是线程化的,所以它的信号和 MainWindow 的槽之间的连接是排队的。

尽管似乎遵循了将某些东西放入 Qt 的元对象系统的所有指南,但当仿真器的线程 emit 发出信号时,我仍然会收到此调试消息:

QObject::connect: Cannot queue arguments of type 'HaltCause'
(Make sure 'HaltCause' is registered using qRegisterMetaType().)

我试过 Enumeration::HaltCause 既是简单的 enum 又是强类型的 enum class。两者产生相同的结果。

我错过了什么?

原来 Emulator 的插槽声明中使用的不合格 HaltCause 混淆了 meta-object 系统。决议是改变

signals:
    void EmulationHalted(HaltCause cause);

signals:
    void EmulationHalted(Emulator::HaltCause cause);

在模拟器声明中 (emulator.h)。