QRemoteObjectHostBase Class
QRemoteObjectHostBase 클래스는 Host 및 RegistryHost 클래스에 공통적으로 적용되는 기본 기능을 제공합니다. 더 보기...
| 헤더: | #include <QRemoteObjectHostBase> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS RemoteObjects) target_link_libraries(mytarget PRIVATE Qt6::RemoteObjects) |
| qmake: | QT += remoteobjects |
| 상속: | QRemoteObjectNode |
| 상속받는 항목: |
공개 유형
| enum | 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는 직접 인스턴스화할 수 없는 기본 클래스입니다. 이 클래스는 모든 호스트 노드(Host 및 RegistryHost)가 공유하는 enableRemoting 및 disableRemoting 기능을 제공할 뿐만 아니라, Remote Objects 네트워크에서 Source 객체를 노출하는 데 필요한 로직도 제공합니다.
멤버 유형 문서
enum QRemoteObjectHostBase::AllowedSchemas
이 열거형은 노드가 hostUrl에 대해 인식되지 않는 스키마를 가진 URL을 허용할지 여부를 지정하는 데 사용됩니다. 기본적으로 알려진 스키마를 가진 URL만 허용되지만, ` AllowExternalRegistration `를 사용하면 레지스트리가 (QtRO 외부) URL을 클라이언트 노드로 전달할 수 있게 됩니다.
| 상수 | 값 | 설명 |
|---|---|---|
QRemoteObjectHostBase::BuiltInSchemasOnly | 0 | hostUrl이 QtRO에서 지원하는 스키마로만 설정되도록 허용합니다. 이는 기본값이며, 인식되지 않는 스키마가 제공될 경우 Node 오류가 발생합니다. |
QRemoteObjectHostBase::AllowExternalRegistration | 1 | 제공된 스키마는 외부 스키마로 등록됩니다. |
QRemoteObjectHost도 참조하십시오 .
멤버 함수 문서
void QRemoteObjectHostBase::addHostSideConnection(QIODevice *ioDevice)
외부 QIODevices를 통해 소스(Source) 객체를 QRemoteObjectHost::enableRemoting()하려면, 호스트 측 연결( Qt Remote Objects )이 해당 노드들 간의 통신 채널( QIODevice)에 접근할 수 있어야 합니다. 소스 측에서 이를 가능하게 하는 것은 addHostSideConnection() 호출이며, 이 호출은 ioDevice 을 입력으로 받습니다. enableRemoting() 호출은 addHostSideConnection을 호출하지 않아도 여전히 작동하지만, Replica 노드와의 연결이 제공되지 않으면 Node는 Source 객체를 공유할 수 없습니다. 이 함수를 호출하기 전에 고유한 URL과 AllowExternalRegistration 을 인수로 전달하여 setHostUrl()을 호출해야 합니다.
addClientSideConnection도 참조하십시오 .
[invokable] bool QRemoteObjectHostBase::disableRemoting(QObject *remoteObject)
QObject remoteObject 에 대한 원격 액세스를 비활성화합니다. 현재 노드가 클라이언트 노드이거나 remoteObject 가 등록되지 않은 경우 false 를 반환하고, Source 객체에 대한 원격 액세스가 성공적으로 비활성화된 경우 true 를 반환합니다.
경고: 이 메서드를 호출한 후에는 이 객체의복제본이 더 이상 유효하지 않습니다.
참고: 이 함수는 메타 객체 시스템과 QML을 통해 호출할 수 있습니다. Q_INVOKABLE 를 참조하십시오.
enableRemoting()도 참조하십시오 .
template <template <typename> typename ApiDefinition, typename ObjectType> bool QRemoteObjectHostBase::enableRemoting(ObjectType *object)
이 템플릿 함수 오버로드를 통해 호스트 노드는 지정된(그리고 컴파일 시점에 검증된) 인터페이스를 가진 소스 객체( QObject, object )에 대한 원격 액세스를 제공할 수 있습니다. 이 객체를 호스팅하는 노드에 연결된 클라이언트 노드는 해당 소스 객체의 복제본(Replicas)을 얻을 수 있습니다.
다음 예제를 통해 이를 가장 잘 설명할 수 있습니다:
#include "rep_TimeModel_source.h"
MinuteTimer timer;
hostNode.enableRemoting<MinuteTimerSourceAPI>(&timer);여기서 MinuteTimerSourceAPI는 ApiDefinition 이며, TimeModel.rep 파일에 정의된 신호/슬롯/속성 집합을 나타냅니다. 입력 QObject 가 요청된 API를 노출할 수 있는지 확인하기 위해 컴파일 시간 검사가 수행되며, 그렇지 않은 경우 컴파일이 실패합니다. 이를 통해 ` object ` 인터페이스의 일부만 노출할 수 있으며, 신호/슬롯 연결에서 지원하는 변환 유형을 사용할 수 있습니다.
현재 노드가 클라이언트 노드이거나, QObject 가 이미 원격으로 등록된 경우 false 를 반환하고, QObject 에 대해 원격 처리가 성공적으로 활성화된 경우 true 를 반환합니다.
disableRemoting()도 참조하십시오 .
[invokable] bool QRemoteObjectHostBase::enableRemoting(QObject *object, const QString &name = QString())
호스트 노드가 QObject object 에 대한 원격 액세스를 동적으로 제공할 수 있게 합니다. 이 객체를 호스팅하는 노드에 연결된 클라이언트 노드는 이 소스의 복제본을 얻을 수 있습니다.
선택 사항인 name 는 QRemoteObjectNode::acquire()를 사용하여 QObject 를 획득할 수 있는 조회 이름을 정의합니다. 명시적으로 설정되지 않은 경우 QCLASSINFO_REMOTEOBJECT_TYPE에 지정된 이름이 사용됩니다. QObject 에 대해 해당 매크로가 정의되지 않은 경우 QObject::objectName()가 사용됩니다.
현재 노드가 클라이언트 노드이거나, QObject 가 이미 원격 처리를 위해 등록된 경우 false 를 반환하고, 동적 QObject 에 대해 원격 처리가 성공적으로 활성화된 경우 true 를 반환합니다.
참고: 이 함수는 메타 객체 시스템과 QML을 통해 호출할 수 있습니다. Q_INVOKABLE 을 참조하십시오.
disableRemoting()도 참조하십시오 .
bool QRemoteObjectHostBase::enableRemoting(QAbstractItemModel *model, const QString &name, const QList<int> roles, QItemSelectionModel *selectionModel = nullptr)
이 enableRemoting() 오버로드는 QAbstractItemModel 유형(또는 QAbstractItemModel 에서 파생된 모든 유형)에 특화되어 있습니다. 이는 모델과 해당 모델의 HMI를 서로 다른 프로세스에 배치하고자 할 때 유용합니다.
세 가지 필수 매개변수는 model 자체, 모델을 조회할 name, 그리고 Replica 측에서 노출되어야 할 roles 입니다. Source와 Replica 간의 선택 내용을 동기화하려면 선택적 매개변수인 selectionModel 를 사용할 수 있습니다. 이는 단일 Replica를 사용할 때만 권장됩니다.
내부적으로 Qt Remote Objects 는 데이터() 조회 요청을 일괄 처리하고, 가능한 경우 데이터를 미리 가져와 모델 상호작용이 최대한 신속하게 이루어지도록 합니다.
현재 노드가 클라이언트 노드이거나, QObject 가 이미 원격 실행을 위해 등록된 경우 false 를 반환하고, QAbstractItemModel 에 대한 원격 실행이 성공적으로 활성화된 경우 true 를 반환합니다.
disableRemoting()도 참조하십시오 .
bool QRemoteObjectHostBase::proxy(const QUrl ®istryUrl, const QUrl &hostUrl = {}, QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })
다른 네트워크의 원격 객체 전달
프록시 기능은 소스 객체를 여러 네트워크에 걸쳐 공유하고자 할 때 유용합니다. 예를 들어, (로컬과 같이) 대상 전용 연결을 사용하는 임베디드 대상이 있고, 그 중 일부 객체를 외부에서도 사용할 수 있게 하고자 하는 경우입니다.
구체적인 예로, 타겟 하드웨어에서 레지스트리를 사용하여 서로 통신하는 일련의 프로세스가 있다고 가정해 봅시다. 이때 레지스트리는 "local:registry"에 위치하고, 소스 객체를 보관하는 "local:MyHost" 노드를 사용하는 별도의 프로세스들이 있습니다. 이러한 객체에 TCP를 통해 액세스하려면 다음과 같이 새로운 proxyNode를 생성할 수 있습니다.
// 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()하고, proxyNode에서 enableRemoting()가 호출됩니다(레플리카가 초기화된 후).
hostUrl 가 제공된 경우( reverseProxy 를 활성화하려면 필수이지만, 그렇지 않은 경우에는 필요하지 않음), 내부 노드는 제공된 주소로 구성된 QRemoteObjectHost 노드가 됩니다. hostUrl 가 제공되지 않은 경우, 내부 노드는 QRemoteObjectNode (HostNode 아님)가 됩니다.
객체가 내부 노드에서 획득된 경우 true 를 반환합니다.
reverseProxy()도 참조하십시오 .
bool QRemoteObjectHostBase::reverseProxy(QRemoteObjectHostBase::RemoteObjectNameFilter filter = [](QStringView, QStringView) {return true; })
원격 객체를 다른 네트워크로 전달합니다.
reverseProxy() 함수를 사용하면 proxy() 기능을 확장할 수 있으며, 이는 사실상 프록시 기능을 "역방향"으로 반영하는 것과 같습니다. 노드 간 통신은 대칭적이지 않기 때문에 이 두 기능은 서로 구별됩니다. 한 쪽은 Source 객체를 사용하여 enableRemoting()를 호출하고, 다른 쪽은 acquire()를 호출하여 Replica를 얻습니다. proxy()을 사용하면 acquire를 통해 대상 장치의 객체를 원격으로 “관찰”할 수 있지만, 대상 외부의 Source 객체를 해당 장치의 local:* 네트워크에서 가져올 수는 없습니다. 바로 여기서 reverseProxy()가 필요합니다. proxyNode가 다음과 같이 생성된 경우:
// myInternalHost is a node only visible on the device...
QRemoteObjectHost myInternalHost("local:MyHost", "local:registry");
// 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://0.0.0.0: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();그리고 다른 장치에서 또 다른 노드를 생성하면:
// Listen on a local port, and connect to "proxyNode" as the registry.
// NB: localhost resolves to a different ip address than proxyNode
QRemoteObjectHost nodeOnRemoteDevice("tcp://localhost:23234",
"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()는 그렇지 않으면 접근할 수 없는 네트워크로 소스 객체를 “푸시”할 수 있게 해줍니다.
참고: reverseProxy()를 호출하기 전에proxy()를 호출해야 하며, reverseProxy()가 작동하려면 proxy 에 hostUrl을 제공해야 합니다. reverseProxy() 메서드를 사용하면 별도의 filter 를 적용할 수 있습니다. 이 reverseProxy 전용 필터는 proxyNode 에서 새로운 Source 객체에 대한 알림을 수신하고, 해당 객체가 filter 를 통과할 경우 내부 노드에서 이를 획득합니다.
성공 시 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.
참고: 현재 리버스 프록시 기능은 QRemoteObjectRegistryHost 에서만 지원됩니다. QRemoteObjectHost 노드에서 이 메서드를 호출하면 항상 false 를 반환합니다.
proxy()도 참조하십시오 .
[override virtual] void QRemoteObjectHostBase::setName(const QString &name)
QRemoteObjectNode::setName(const QString &name)을 재구현합니다.
QObject::setObjectName() (이 메서드가 호출하는 함수)와 유사하지만, 이 버전은 디버깅 출력 중 일부에 사용되는 내부 클래스에도 ` name `을 적용합니다.
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.