enum и enum классы в Qt Queued Slots - PullRequest
0 голосов
/ 20 июня 2019

Следуя советам из документации 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.Оба дают одинаковые результаты.

Чего мне не хватает?

1 Ответ

1 голос
/ 20 июня 2019

Оказывается, неквалифицированный HaltCause, использованный в объявлении слота Emulator, запутал мета-объектную систему.Разрешение должно было изменить

signals:
    void EmulationHalted(HaltCause cause);

на

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

в объявлении эмулятора (emulator.h).

...