Получил "метаобъект Dynami c не назначен" при запуске QtRemoteObjects - PullRequest
1 голос
/ 07 января 2020

Я пытаюсь использовать QRemoteObjects, чтобы поделиться более чем двумя объектами, но я получил предупреждение "Динамический c метаобъект не назначен" при запуске client.py пример, и я не могу найти что случилось, мой пример работает нормально, кто-нибудь может дать мне несколько советов?

server.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()

client.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

1 Ответ

1 голос
/ 08 января 2020

В C ++ вы можете приобрести реплику двумя способами:

В качестве второго метода используется QRemoteObjectDynamicReplica, представляющий собой объект, который создается на лету путем копирования свойств , сигналы и слоты, но не содержит всю информацию о классе узла, поэтому он не является точной копией, поэтому имеет недостатки, как документы :

Сгенерировано реплики (реплики, имеющие заголовочные файлы, созданные компилятором реплики) и динамические c реплики, которые создаются на лету. Это класс для реплики типа Dynami c.

Когда установлено соединение с исходным объектом, шаг инициализации передает текущие значения свойств (см. Инициализация реплики). В DynamicReplica также отправляются сведения о свойстве / сигнале / слоте, что позволяет создавать объект реплики на лету. Это может быть удобно в QML или сценариях, но имеет два основных недостатка. Во-первых, объект фактически пуст, пока он не будет успешно инициализирован источником. Во-вторых, в C ++ вызовы должны выполняться с использованием QMetaObject :: invokeMethod (), так как сгенерированный поиск mo c не будет доступен.

(выделено мое)

А в случае PyQt он поддерживает только второй метод, поэтому вы получите это предупреждающее сообщение с указанием возможных проблем.

...