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)。
根据 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)。