Невозможно подключиться к сигналу в QML, испускаемому Python

У меня есть класс QQuickItem, созданный в Python:

class MyPage(QQuickItem):
    def __init__(self, parent=None) -> None:
        super().__init__(parent)
        error_encountered = Signal(str)

    @QtCore.Slot(QUrl, result=None)
    def load_report(self, file_path: QUrl) -> None:
        print(f"Called with: {file_path}")
        self.error_encountered.emit("Uh oh!")

Вышеупомянутый класс зарегистрирован как:

qmlRegisterType(MyPage, "MyPage", 1, 0, "MyPage")

Мой QML выглядит так:

MyPage {
    signal errorEncountered(string text)
    Component.onCompleted: error_encountered.connect(errorEncountered)
    onErrorEncountered: console.log(text)
}

Однако я получаю следующую ошибку:

qrc:/qml/main.qml:93: ReferenceError: error_encountered is not defined

Шаблон для PySide2 для подключения к сигналам из QML в исходный код немного отличается в Python от C++, и мне трудно его понять. В C++ у меня был бы сигнал, определенный как void errorEncountered(const QString& errorMessage);, а в моем QML я мог бы просто сделать onErrorEncountered: console.log(errorMessage).


person roundtheworld    schedule 24.07.2019    source источник


Ответы (1)


Сигналы объявлены как атрибут класса, то есть не должны создаваться ни в одном методе класса. Решение:

class MyPage(QQuickItem):
    error_encountered = Signal(str) # <---

    def __init__(self, parent=None) -> None:
        super().__init__(parent)

    @QtCore.Slot(QUrl, result=None)
    def load_report(self, file_path: QUrl) -> None:
        print(f"Called with: {file_path}")
        self.error_encountered.emit("Uh oh!")
person eyllanesc    schedule 24.07.2019