Spec-Zone.ru › Qt 5.15

Класс QRemoteObjectHostBase

Класс QRemoteObjectHostBase предоставляет базовые функции, общие для классов Host и RegistryHost. Подробнее...

Заголовок: #include <QRemoteObjectHostBase>
qmake: QT += remoteobjects
Наследует: QRemoteObjectNode
Наследуется:

QRemoteObjectHost и QRemoteObjectRegistryHost

  • Список всех членов, включая наследуемые

Открытые типы

Перечисление AllowedSchemas { BuiltInSchemasOnly, AllowExternalRegistration }

Открытые функции

void addHostSideConnection(QIODevice *ioDevice)
bool disableRemoting(QObject *remoteObject)
bool enableRemoting(ObjectType *object)
bool enableRemoting(QObject *object, const QString &name = QString())
bool enableRemoting(QAbstractItemModel *model, const QString &name, const QVector<int> roles, QItemSelectionModel *selectionModel = nullptr)
bool proxy(const QUrl &registryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](const QString &, const QString &) {return true; })
bool reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](const QString &, const QString &) {return true; })

Переопределенные открытые функции

виртуальный void setName(const QString &name) override

Подробное описание

QRemoteObjectHostBase — базовый класс, который нельзя создавать напрямую. Он предоставляет функции enableRemoting и disableRemoting, общие для всех узлов-хостов (Host и RegistryHost), а также логику, необходимую для экспонирования объектов Source в сети удаленных объектов.

Документация по типам членов

Перечисление QRemoteObjectHostBase::AllowedSchemas

Это перечисление используется для указания того, будет ли узел принимать URL с неизвестной схемой для hostUrl. По умолчанию принимаются только URL с известными схемами, но использование AllowExternalRegistration позволит реестру передавать ваши внешние (для QtRO) URL-адреса клиентским узлам.

Константа Значение Описание
QRemoteObjectHostBase::BuiltInSchemasOnly 0 Разрешить использование только поддерживаемых QtRO схем hostUrl. Это значение по умолчанию, и если будет предоставлена неизвестная схема, то узел вернет ошибку.
QRemoteObjectHostBase::AllowExternalRegistration 1 Указанная схема зарегистрирована как Внешняя схема

См. также QRemoteObjectHost.

Документация по функциям-членам

void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)

Для вызова QRemoteObjectHost::enableRemoting() для объектов Source через Внешние QIODevice, Qt Remote Objects необходимо получить доступ к каналу связи (QIODevice) между соответствующими узлами. Функция addHostSideConnection() выполняет это на стороне Source, принимая ioDevice в качестве входного параметра. Вызов enableRemoting() может быть выполнен и без addHostSideConnection(), но узел не сможет обмениваться объектами Source без предоставления соединения с узлом Replica. Перед вызовом этой функции необходимо вызвать setHostUrl() с уникальным URL-адресом и AllowExternalRegistration.

Эта функция была добавлена в Qt 5.12.

См. также addClientSideConnection.

bool QRemoteObjectHostBase::disableRemoting(QObject *remoteObject)

Отключает удаленный доступ для объекта QObject remoteObject. Возвращает false , если текущий узел является клиентом или если remoteObject не зарегистрирован, и возвращает true , если удаленный доступ для объекта Source успешно отключен.

Предупреждение: Копии этого объекта больше не будут действительны после вызова этого метода.

Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.

См. также enableRemoting().

шаблон <шаблон <typename> ApiDefinition, typename ObjectType> bool QRemoteObjectHostBase::enableRemoting(ObjectType *object)

Этот шаблонный перегруз функции позволяет узлу-хосту предоставлять удаленный доступ к объекту QObject object с указанным (и проверенным во время компиляции) интерфейсом. Клиентские узлы, подключенные к узлу, который содержит этот объект, могут получить копии этого объекта Source.

Это лучше всего проиллюстрировать примером:

#include "rep_TimeModel_source.h"
MinuteTimer timer;
hostNode.enableRemoting<MinuteTimerSourceAPI>(&timer);

Здесь MinuteTimerSourceAPI — это набор сигналов/слотов/свойств, определенных в файле TimeModel.rep. Во время компиляции проверяется, может ли входной объект QObject экспонировать запрашиваемый API; в противном случае компиляция завершится ошибкой. Это позволяет экспонировать подмножество интерфейса object и определяет типы преобразований, поддерживаемых соединениями сигналов/слотов.

Возвращает false , если текущий узел является клиентским узлом или если QObject уже зарегистрирован для удаленного доступа, и true , если удаленный доступ к QObject успешно включен.

См. также disableRemoting().

bool QRemoteObjectHostBase::enableRemoting(QObject *object, const QString &name = QString())

Включает удаленный доступ к объекту QObject object динамически на узле-хосте. Клиентские узлы, подключенные к узлу, содержащему этот объект, могут получить копии этого объекта Source.

Необязательный параметр name определяет имя для поиска объекта QObject с помощью QRemoteObjectNode::acquire(). Если этот параметр не указан, используется имя, указанное в QCLASSINFO_REMOTEOBJECT_TYPE. Если такой макрос для QObject не определен, используется QObject::objectName().

Возвращает false , если текущий узел является клиентом, или если QObject уже зарегистрирован для удалённого доступа, и true , если удалённый доступ к динамическому QObject успешно включён.

Примечание: Эта функция может быть вызвана через систему метаобъектов и из QML. См. Q_INVOKABLE.

См. также disableRemoting().

bool QRemoteObjectHostBase::enableRemoting(QAbstractItemModel *model, const QString &name, const QVector<int> roles, QItemSelectionModel *selectionModel = nullptr)

Этот перегруз enableRemoting() специфичен для типов QAbstractItemModel (или любых типов, наследующих от QAbstractItemModel). Это полезно, если вы хотите иметь модель и HMI для модели в разных процессах.

Три обязательных параметра — это сам модель, имя для поиска модели и роли, которые должны быть доступны на стороне Replica. Если вы хотите синхронизировать выбор между источником и репликой, можно использовать необязательный параметр selectionModel. Это рекомендуется только при использовании одной реплики.

За кулисами Qt Remote Objects группирует запросы data() и предварительно загружает данные, когда это возможно, чтобы сделать взаимодействие с моделью максимально отзывчивым.

Возвращает false, если текущий узел является узлом клиента или если QObject уже зарегистрирован для удалённого вызова, и true, если удалённый вызов успешно включён для QAbstractItemModel.

См. также disableRemoting().

bool QRemoteObjectHostBase::proxy(const QUrl &registryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](const QString &, const QString &) {return true; })

Перенаправление удалённых объектов с другого сетевого узла

Функциональность прокси полезна, когда вы хотите обмениваться объектами источника через несколько сетей. Например, если у вас есть встроенная цель, использующая только соединения с целевым узлом (например, локальные), и вы хотите предоставить доступ к некоторым из этих же объектов внешнему узлу.

В качестве конкретного примера предположим, что у вас есть набор процессов, взаимодействующих друг с другом на целевом оборудовании с помощью реестра, причём реестр Registry находится по адресу "local:registry", а отдельные процессы используют узел "local:MyHost", содержащий объекты источника. Если вы хотите получить доступ к этим объектам, но через TCP, вы можете создать новый узел-прокси следующим образом:

// myInternalHost is a node only visible on the device...
QRemoteObjectHost myInternalHost("local:MyHost");
myInternalHost.enableRemoting<SomeObject>(&someObject);

// Regular host node, listening on port 12123, so visible to other
// devices
QRemoteObjectHost proxyNode("tcp://localhost:12123");

// Enable proxying objects from nodes on the local machine's internal
// QtRO bus
proxyNode.proxy("local:registry");

А с другого устройства создайте другой узел:

// NB: localhost resolves to a different ip address than proxyNode
QRemoteObjectHost nodeOnRemoteDevice("tcp://localhost:23234");

// Connect to the target's proxyNode directly, or use a tcp registry...
nodeOnRemoteDevice.connectToNode("tcp://<target device>:12123");

// Because of the proxy, we can get the object over tcp/ip port 12123,
// even though we can't connect directly to "local:MyHost"
SomeObject *so = nodeOnRemoteDevice.acquire<SomeObject>();

Это (внутренне) создаст узел в proxyNode, который (снова внутренне/автоматически) подключится к предоставленному реестру (указанному параметром registryUrl, в этом примере "local:registry"). Всякий раз, когда local:registry генерирует сигнал remoteObjectAdded, QRemoteObjectSourceLocation передаётся фильтру filter, указанному в вызове прокси. Если этот метод возвращает true (по умолчанию фильтр просто возвращает true без фильтрации), объект приобретается с помощью acquire() из внутреннего узла, и enableRemoting() (после инициализации реплики) вызывается для proxyNode.

Если задан параметр hostUrl (который требуется для включения reverseProxy, но в противном случае не нужен), внутренний узел будет узлом QRemoteObjectHost, настроенным с указанным адресом. Если hostUrl не указан, внутренний узел будет узлом QRemoteObjectNode (а не HostNode).

Возвращает true, если объект приобретён из внутреннего узла.

Эта функция была добавлена в Qt 5.11.

См. также reverseProxy().

bool QRemoteObjectHostBase::reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](const QString &, const QString &) {return true; })

Перенаправление удалённых объектов на другую сеть.

Функция reverseProxy() позволяет расширить функциональность proxy(), фактически отражая функциональность прокси в обратном направлении. Они различаются, поскольку взаимодействие узлов несимметрично: одна сторона вызывает enableRemoting() с объектом источника, а другая сторона вызывает acquire() для получения реплики. Использование proxy() позволяет удалённо «наблюдать» за объектами на целевом устройстве с помощью acquire, но не позволяет приобретать объекты источника с локальной сети устройства. Именно здесь используется reverseProxy(). Если узел-прокси создан следующим образом:

// myInternalHost is a node only visible on the device...
QRemoteObjectHost myInternalHost("local:MyHost");

// RegistryHost node, listening on port 12123, so visible to other
// devices.  The node must be a RegistryHost, so the Sources on
// the "outside" network can be forwarded to the inner network.
QRemoteObjectRegistryHost proxyNode("tcp://localhost:12123");

// Enable proxying objects from nodes on the local machine's internal
// QtRO bus.  Note the hostUrl parameter is now needed.
proxyNode.proxy("local:registry", "local:fromProxy");
proxyNode.reverseProxy();

И с другого устройства вы создаёте другой узел:

// NB: localhost resolves to a different ip address than proxyNode
QRemoteObjectHost nodeOnRemoteDevice("tcp://localhost:23234");

// Connect to the target's proxyNode directly, or use a tcp registry...
nodeOnRemoteDevice.connectToNode("tcp://<target device>:12123");

// Because of the reverseProxy, we can expose objects on this device
// and they will make their way to proxyNode...
nodeOnRemoteDevice.enableRemoting<OtherObject>(&otherObject);
// Acquire() can now see the objects on other devices through proxyNode,
// due to the reverseProxy call.
OtherObject *oo = myInternalHost.acquire<OtherObject>();

В то время как функциональность proxy() позволяет приобретать объекты источника в другой сети с помощью acquire(), reverseProxy() позволяет «подталкивать» объекты источника в иначе недоступную сеть.

Примечание: proxy() необходимо вызывать перед reverseProxy(), и параметр hostUrl необходимо передавать в proxy для работы reverseProxy(). Метод reverseProxy() позволяет применить отдельный фильтр filter. Этот специфичный для reverseProxy фильтр будет получать уведомления о новых объектах источника на proxyNode и приобретать их на внутреннем узле, если они пройдут обратный фильтр.

Возвращает true при успехе, false в противном случае.

Эта функция была добавлена в Qt 5.11.

См. также proxy().

[override virtual] void QRemoteObjectHostBase::setName(const QString &name)

Переопределяет: QRemoteObjectNode::setName(const QString &name).

Аналогично QObject::setObjectName() (которое этот метод вызывает), но этот вариант также применяет имя к внутренним классам, которые используются в некоторых сообщениях отладки.

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

Spec-Zone.ru

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