Класс QRemoteObjectHostBase
Класс QRemoteObjectHostBase предоставляет базовые функциональные возможности, общие для классов Host и RegistryHost. Подробнее...
| Заголовок: | #include <QRemoteObjectHostBase> |
| CMake: | find_package(Qt6 COMPONENTS RemoteObjects REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects) |
| qmake: | QT += remoteobjects |
| Наследует: | QRemoteObjectNode |
| Наследуется: |
Типы публичного доступа
| Перечисление | 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 ®istryUrl, 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 ®istryUrl, 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