Qt: Как я должен направить сигнал к соответствующему объекту динамически? - PullRequest
0 голосов
/ 19 декабря 2018

Я пишу приложение в Qt.Я пытаюсь создать систему сигналов и слотов для подключения одного потока контроллера к нескольким потокам, которые представляют реальные устройства.Количество устройств известно во время компиляции, но я хотел бы, чтобы было как можно проще изменить их количество.Мой первоначальный подход использовал шаблоны для сигналов, что-то вроде этого:

signals:
    template<int whichOne> void updateDoohickeyState(dooHickeyState newState);

Я надеялся, что затем смогу подключить их к устройствам следующим образом:

connect(doohickeyController, doohickeyController::updateDoohickeyState<0>,
        doohickeys[0], doohickeyObject::updateState,
        Qt::QueuedConnection);

connect(doohickeyController, doohickeyController::updateDoohickeyState<1>,
        doohickeys[1], doohickeyObject::updateState,
        Qt::QueuedConnection);
// Etc...

Затем, когда яхотел сигнализировать устройство, я мог сделать что-то вроде:

emit updateDoohickeyState<0>(doohickeyState);
emit updateDoohickeyState<1>(anotherDoohickeyState);

К сожалению, MOC Qt не поддерживает шаблоны для сигналов и слотов;следовательно, это не работает.

Итак, как еще я могу это реализовать?У меня есть один контроллер, который должен сигнализировать одному из нескольких идентичных устройств в других потокахВ идеале я хотел бы сделать это, не добавляя больше сигналов (более сложное для обновления позже), фильтруя слоты (неэффективно) или добавляя другой класс в середине.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Звучит так, как будто вы, возможно, захотите pub / sub service .Это довольно легко реализовать в Qt, используя сигналы / слоты и Q_Object для сервиса.

0 голосов
/ 19 декабря 2018

Вы можете вызвать слот объекта напрямую, используя QMetaObject :: invokeMethod вместо испускания подключенного сигнала.Как это:

QMetaObject::invokeMethod(doohickeys[0], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, doohickeyState));
QMetaObject::invokeMethod(doohickeys[1], "updateState", Qt::QueuedConnection, Q_ARG(dooHickeyState, anotherDoohickeyState));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...