Следуя советам из документации Qt и ответов на этот вопрос , я структурировал код так:
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
.Оба дают одинаковые результаты.
Чего мне не хватает?