根据Qt documentation和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类具有一个匹配的插槽:
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
来进行此操作。两者产生相同的结果。
我想念什么?
答案 0 :(得分:1)
找出HaltCause
的插槽声明中使用的不合格Emulator
,混淆了元对象系统。决议是要改变的
signals:
void EmulationHalted(HaltCause cause);
到
signals:
void EmulationHalted(Emulator::HaltCause cause);
在仿真器声明(emulator.h)中。