1

我尝试使用共享两个以上的对象,但在运行client.pyQRemoteObjects示例时收到“未分配动态元对象”警告,我无法找出发生了什么,我的示例工作正常,谁能给我一些建议?

服务器.py

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtRemoteObjects import *
from faker import Faker

fake = Faker()

class Name(QObject):
    sig_name = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.name = ''
        self.startTimer(1000)

    def timerEvent(self, event):
        self.name = fake.name()
        self.sig_name.emit(self.name)

class Email(QObject):
    sig_email = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.startTimer(1000)

    def timerEvent(self, event):
        self.sig_email.emit(fake.email())


class Server(QObject):
    def __init__(self):
        super().__init__()
        self.name = Name()
        self.email = Email()

        host = QRemoteObjectHost(QUrl('local:server'), self)
        r1 = host.enableRemoting(self.name, 'name')
        r2 = host.enableRemoting(self.email, 'email')

        print([r1, r2])

    def print_name(self, x):
        print(x)

app = QCoreApplication([])
s = Server()
app.exec()

客户端.py

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtRemoteObjects import *

class Client(QObject):
    def __init__(self):
        super().__init__()
        node = QRemoteObjectNode(self)
        node.connectToNode(QUrl("local:server"))

        self.remote_name = node.acquireDynamic('name')
        self.remote_email = node.acquireDynamic('email')

        self.remote_name.initialized.connect(self.onInitName)
        self.remote_email.initialized.connect(self.onInitEmail)

    def onInitName(self):
        self.remote_name.sig_name.connect(self.print_info)

    def onInitEmail(self):
        self.remote_email.sig_email.connect(self.print_info)

    def print_info(self, x):
        print('-->:', x)

app = QCoreApplication([])
c = Client()
app.exec()

在我python server.py在一号航站楼运行并python client.py在二号航站楼运行之后。我在二号航站楼收到了如下警告。 1

4

1 回答 1

1

在 C++ 中,您可以使用 2 种方法购买副本:

观察第二种方法时,QRemoteObjectDynamicReplica使用了一个对象,它是通过复制属性、信号和槽来动态创建的类,但不包含节点类的所有信息,因此它不是一个精确的副本,所以正如文档指出的那样,它有缺点:

有生成的副本(具有副本编译器生成的头文件的副本)和动态生成的动态副本。这是副本的动态类型的类。

当与 Source 对象建立连接时,初始化步骤会传递当前属性值(请参阅副本初始化)。在 DynamicReplica 中,还会发送属性/信号/插槽详细信息,从而允许动态创建副本对象。这在 QML 或脚本中可能很方便,但有两个主要缺点。首先,对象在被 Source 成功初始化之前实际上是“空的”。其次,在 C++ 中,必须使用 QMetaObject::invokeMethod() 进行调用,因为 moc 生成的查找将不可用。

(强调我的)

而对于 PyQt,它仅支持第二种方法,因此您会收到指示可能存在问题的警告消息。

于 2020-01-07T22:15:44.463 回答