Qt排队插槽中的枚举和枚举类

时间:2019-06-20 17:58:50

标签: c++ qt enums enum-class

根据Qt documentationthis 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类具有一个匹配的插槽:

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

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

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

以及稍后在MainWindow类中调用的方法中

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

Emulator类是线程化的,因此其信号与MainWindow的插槽之间的连接已排队。

尽管表面上遵循了将某些东西放入Qt的元对象系统的所有准则,但是当仿真器的线程emit发出信号时,我仍然会收到以下调试消息:

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

我已经尝试过使用Enumeration::HaltCause作为简单的enum和强类型的enum class来进行此操作。两者产生相同的结果。

我想念什么?

1 个答案:

答案 0 :(得分:1)

找出HaltCause的插槽声明中使用的不合格Emulator,混淆了元对象系统。决议是要改变的

signals:
    void EmulationHalted(HaltCause cause);

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

在仿真器声明(emulator.h)中。