воссоздать новый JS объект для того же python объекта - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть два класса: ClassA и ClassB, оба написаны на python и экспортированы в QML.

class ClassA(QObject):
    bChanged = pyqtSignal()

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

    @pyqtProperty(QObject, notify=bChanged)
    def b(self):
        return self._b

    @b.setter
    def b(self, val):
        self._b = val
        self.bChanged.emit()


class ClassB(QObject):
    def __init__(self, parent=None):
        super().__init__(parent)

    # Do reference test in python
    @pyqtSlot(QObject, result=bool)
    def equal(self, ref):
        return self == ref


...

def main():
    # and I export them to QML by...
    qmlRegisterType(ClassA, 'CustomClass', 1, 0, 'ClassA')
    qmlRegisterType(ClassB, 'CustomClass', 1, 0, 'ClassB')

И я написал три теста. Одно из свойств b объекта ClassA присваивается QQuickRectangle

import QtQuick 2.12
import QtQuick.Controls 2.12
import CustomClass 1.0

ApplicationWindow {
    width: 800
    height: 600
    visible: true

    ClassA {
        b: ClassB {
            id: bb
        }
        Component.onCompleted: {
            console.log('test 1:'+(this.b==bb).toString())
            console.log('test 2:'+(this.b.equal(bb)).toString())
        }
    }


    ClassA {
        b: Rectangle {
            id: rec
        }
        Component.onCompleted: {
            console.log('test 3:'+(this.b==rec).toString())
        }
    }
}

Результат:

Test 1: false
Test 2: true
Test 3: true

Это связано с реализацией PyQT5? Текущий обходной путь, который сравнивает ссылку python с дополнительным слотом, очень неудобен и несовместим с остальным кодом QML.

MRE можно найти здесь https://gist.github.com/tim37021/0f0decb68ba3d7183f840c5b0065cf43

...