【问题标题】:enums and enum classes in Qt Queued SlotsQt Queued Slots 中的枚举和枚举类
【发布时间】:2019-06-20 17:58:50
【问题描述】:

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

模拟器.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 元对象系统的所有准则,但当 Emulator 的线程 emits 发出信号时,我仍然收到此调试消息:

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

我已经尝试过将Enumeration::HaltCause 用作简单的enum 和强类型的enum class。两者产生相同的结果。

我错过了什么?

【问题讨论】:

    标签: c++ qt enums enum-class


    【解决方案1】:

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

    signals:
        void EmulationHalted(HaltCause cause);
    

    到

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

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

    【讨论】:

    • 听起来你应该在 bugreports.qt.io 上报告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多