Spec-Zone.ru › Qt 5.9

Qt Удаленные объекты Источник

Источники объектов

Источник удаленного объекта — это QObject, отвечающий за реализацию экспонированного API.

В общем случае у вас есть возможность использовать тип QObject непосредственно в качестве источника или определить желаемый API в шаблоне .rep для использования с компилятором repc.

Если у вас уже есть полностью определенный QObject, он может стать источником, просто передав его в QRemoteObjectHostBase::enableRemoting(). Это позволит другим процессам/устройствам создать Реплику объекта для взаимодействия (см. Взаимодействие с удаленным объектом). Затем вы можете создать QRemoteObjectDynamicReplica вашего объекта или использовать макрос QOBJECT_REPLICA в файле проекта, который будет использовать repc для создания заголовочного файла, описывающего Реплику для использования в этом процессе/на этом устройстве (и предоставляет проверки на этапе компиляции).

Позволяя repc генерировать заголовочный файл Источника для вашего проекта (используя макрос REPC_SOURCE) предоставляет три варианта реализации желаемого API. Если имя вашего класса было Foo, варианты были бы следующими (и см. Формат файла rep для получения помощи в создании файла rep):

  • Наследование FooSimpleSource
  • Наследование FooSource
  • Использование FooSourceAPI с вашим собственным QObject

В заголовке определен класс <Type>SimpleSource, который предоставляет базовые методы getter/setter для каждой свойства и реализует члены данных правильного типа свойства в заголовке. Здесь «<Type>» представляет имя класса из файла .rep, поэтому если ваш класс имеет тип «MyType» в файле .rep, в сгенерированном заголовочном файле будет объявлен класс MyTypeSimpleSource. Это быстрый способ начать работу с API. Для использования этого класса вам нужно унаследовать от этого класса и реализовать все определенные слоты (которые являются чисто виртуальными в сгенерированном заголовочном файле). Любая логика, необходимая для управления экспонированными свойствами и определения того, когда необходимо испускать сигналы, также будет добавлена в переопределяемый класс.

Если вам нужно скрыть детали реализации, можно использовать класс <Type>Source вместо этого, который является вторым классом, объявленным в том же результирующем заголовочном файле. Это определение класса не предоставляет членов данных и делает функции getter/setter также чисто виртуальными. У вас больше гибкости в том, как вы реализуете класс, хотя вам нужно написать больше кода. Это определяет API как для стороны источника, так и для стороны реплики из одного шаблона файла .rep.

Наконец, в заголовке сгенерирован класс <Type>SourceAPI. Это шаблонный класс, предназначенный для использования специально с перегруженным вариантом шаблонной функции QRemoteObjectHostBase::enableRemoting(), который позволяет использовать любой QObject, поддерживающий желаемый API, в качестве источника. Вы получите предупреждения на этапе компиляции, если класс не предоставляет правильный API, а использование этого класса позволяет скрыть или преобразовать свойства или параметры сигналов/слотов.

Примечание: API QObject никогда не экспонируется. Например, хотя у Реплики будет сигнал destroyed, сигнал destroyed источника не передается. Источник и каждая Реплика являются уникальными QObjects со своими собственными подключениями. API, который экспонируется, определяется шаблоном .rep, используемым repc, или в случае ссылочных QObjects, все элементы API, определенные в цепочке наследования от определенного предка. Если вы не определите Q_CLASSINFO("RemoteObject Type") в предке, используется родитель QObject. Если используется Q_CLASSINFO("RemoteObject Type"), API этого класса является самым низким уровнем используемого API.

Идентификация источников

Поскольку более одного Источника может быть совместно использован узлом-хостом, каждый Источник требует имени. Все сгенерированные repc заголовки включают способ определения узлом имени класса (Q_CLASSINFO для типов реплики/simplesource/source или статической функции name() для типа SourceAPI). Если вы передаете свой собственный тип QObject в QRemoteObjectHostBase::enableRemoting(), имя будет определяться следующим образом:

  • Если у объекта или любого из его предков определен Q_CLASSINFO типа "RemoteObject Type", предоставленное имя будет использоваться.
  • В противном случае будет использоваться objectName QObject (если он задан).
  • Если ни то, ни другое недоступно, вызов QRemoteObjectHostBase::enableRemoting() завершится неудачей, вернув False.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qtremoteobjects-source.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API