PySide2 在访问 QObject::property() 时崩溃

PySide2 crashes while accessing QObject::property()

所以我不确定这是一个错误还是什么,但我花了很多时间来解决这个问题,但没能解决。访问调用 QObject::property() 函数时会出现问题。 这是一个最小的可重现示例:

import sys

from PySide2 import QtCore
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import Qt, QCoreApplication, QObject, Slot
from PySide2.QtQml import QQmlApplicationEngine, QQmlContext



class MyItem(QObject):
    def __init__(self):
        super(MyItem, self).__init__()
        self.name = "John"
        self.age = 22

    @QtCore.Property(QtCore.QObject, constant=True)
    def getName(self):
        return self.name

    @QtCore.Property(QtCore.QObject, constant=True)
    def getAge(self):
        return self.age

if __name__ == '__main__':
    app = QApplication(sys.argv)
    provider = MyModelProvider()
    item = MyItem()
    print(item.property("getName")) # the program crashes here
    QApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
    QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)

    engine = QQmlApplicationEngine()
    engine.rootContext().setContextProperty('provider', provider)
    engine.load('qml/main.qml')
    sys.exit(app.exec_())

程序总是崩溃并输出以下内容:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

您的代码失败,因为 returns getName 的变量不是 QObject 而是 str,类似于 getAge returns一个int,所以解决办法就是设置正确的签名

import sys

from PySide2.QtCore import Property, QObject, QCoreApplication


class MyItem(QObject):
    def __init__(self, parent=None):
        super(MyItem, self).__init__(parent)
        self.name = "John"
        self.age = 22

    @Property(str, constant=True)
    def getName(self):
        return self.name

    @Property(int, constant=True)
    def getAge(self):
        return self.age


if __name__ == "__main__":
    app = QCoreApplication(sys.argv)
    item = MyItem()
    print(item.property("getName"))
    print(item.property("getAge"))

输出:

John
22