1

所以我不确定这是一个错误还是什么,但我花了很长时间来解决这个问题,但无法解决。访问调用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)
4

1 回答 1

1

您的代码失败,因为返回的变量getName不是 aQObject而是 a str,类似于getAge返回 a 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
于 2019-08-27T08:49:56.227 回答