Spec-Zone.ru › Qt

Класс QRemoteObjectHostBase

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

Заголовок: #include <QRemoteObjectHostBase>
CMake: find_package(Qt6 COMPONENTS RemoteObjects REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects)
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 QList<int> roles, QItemSelectionModel *selectionModel = nullptr)
bool proxy(const QUrl &registryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })
bool reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })

Переопределённые публичные функции

virtual void setName(const QString &name) override

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

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

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

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

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

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

См. также QRemoteObjectHost.

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

[since 5.12] void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)

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

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

См. также addClientSideConnection.

[invokable] bool QRemoteObjectHostBase::disableRemoting(QObject *remoteObject)

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

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

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

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

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

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

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

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

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

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

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

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

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

Необязательное 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 QList<int> roles, QItemSelectionModel *selectionModel = nullptr)

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

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

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

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

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

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

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

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

В качестве конкретного примера, предположим, что у вас есть набор процессов, взаимодействующих друг с другом на вашем целевом оборудовании с помощью реестра, где реестр находится по адресу "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, заданному в вызове proxy. Если этот метод возвращает true (по умолчанию фильтр просто возвращает true без фильтрации), объект приобретается (acquire()) из внутреннего узла, и enableRemoting() (после инициализации реплики) вызывается для proxyNode.

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

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

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

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

[since 5.11] bool QRemoteObjectHostBase::reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {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() позволяет получить доступ к объектам Источник в другой сети, reverseProxy() позволяет «передавать» объекты Источник в иную, иначе недоступную сеть.

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

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

Примечание: В настоящее время функциональность обратного прокси поддерживается только для QRemoteObjectRegistryHost. Вызов этого метода для узла QRemoteObjectHost всегда вернёт 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-6.2/qremoteobjecthostbase.html

Spec-Zone.ru

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