У меня есть два класса: 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