Источник удаленных объектов Qt
На высоком уровне вы можете выбрать использование типа QObject напрямую в качестве источника; или вы можете определить желаемый API в .rep шаблоне для использования с компилятором repc.
Если у вас уже есть полностью определенный QObject, вы можете использовать его в качестве источника, передав его в QRemoteObjectHostBase::enableRemoting(). Таким образом, другие процессы или устройства могут затем создать динамические копии объекта для взаимодействия.
Дополнительную информацию см. в разделе Взаимодействие с удаленным объектом.
Позволение repc генерировать заголовочный файл источника для вашего проекта, используя переменную REPC_SOURCE, предоставляет три различных варианта реализации необходимого API.
Предположим, что имя вашего класса — Foo, тогда у вас есть следующие варианты:
- Наследование от FooSimpleSource
- Наследование от FooSource
- Использование FooSourceAPI со своим QObject
Дополнительную информацию о создании файла .rep, см. в разделе Формат файла rep.
В заголовке определен класс <Type>SimpleSource, который предоставляет основные методы получения/установки для каждого свойства и реализует члены данных правильного типа свойства в заголовке. "<Type>" здесь представляет имя класса из файла .rep, поэтому если ваш класс имеет тип "MyType" в файле .rep, то сгенерированный заголовочный файл будет иметь объявленный класс MyTypeSimpleSource. Это быстрый способ начать работу с API. Для использования этого класса необходимо написать класс, который наследуется от него и реализовать любые определенные слоты, которые помечены как чисто виртуальные в сгенерированном заголовочном файле. Вам также необходимо добавить необходимую логику для управления экспонированными свойствами и отправки сигналов в свой класс.
Если вам нужно скрыть детали реализации, используйте второй класс, объявленный в заголовке, класс <Type>Source. Определение этого класса не предоставляет членов данных, а также делает функции получения/установки чисто виртуальными. Хотя вам может потребоваться написать больше кода, использование этого класса предоставляет больше гибкости в вашей реализации.
Третий сгенерированный в заголовке класс — <Type>SourceAPI. Это шаблонный класс, предназначенный для использования с шаблонной версией QRemoteObjectHostBase::enableRemoting(), что позволяет использовать любой QObject, который поддерживает необходимый API, в качестве источника. Используйте этот класс для сокрытия или преобразования свойств или параметров сигналов/слотов. Если ваша реализация не предоставляет правильного API, появятся предупреждения во время компиляции.
Примечание: Реплики и источники оба наследуются от QObject; но их API QObject никогда не экспонируется. Например, хотя у реплики есть сигнал destroyed, сигнал destroyed источника не распространяется. Источник и каждая его реплика — уникальные QObjects со своими подключениями и жизненными циклами. Вместо этого API, который экспонируется, определяется шаблоном .rep используемым repc. В случае с исходными QObjects все элементы API определены в цепочке наследования от определенного предка. Родитель QObject всегда используется, если вы не определите Q_CLASSINFO("RemoteObject Type") в предке. Если вы используете Q_CLASSINFO("RemoteObject Type"), API этого класса является самым низким уровнем используемого API.
Определение источников
Поскольку узел-хост может совместно использовать более одного источника, каждый источник требует имени. Все сгенерированные repc заголовки включают способ определения имени класса узлом: Q_CLASSINFO для типов реплики, simplesource или source; или статическую функцию name() для типа SourceAPI. Если вы передаете свой собственный тип QObject в QRemoteObjectHostBase::enableRemoting(), имя определяется следующим образом:
- Имя может быть необязательно передано в QRemoteObjectHostBase::enableRemoting(). Если оно указано, используется это имя.
- Если у объекта или любого из его предков определен Q_CLASSINFO типа "Тип удаленного объекта", используется это имя типа.
- Если имя объекта QObject установлено, используется оно.
- Если ни один из вышеперечисленных вариантов не доступен, вызов QRemoteObjectHostBase::enableRemoting() завершается неудачей, возвращая false.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.2/qtremoteobjects-source.html