【问题标题】:PySide2 crashes while accessing QObject::property()PySide2 在访问 QObject::property() 时崩溃
【发布时间】:2019-12-31 00:40:53
【问题描述】:

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

【问题讨论】:

    标签: python qt pyside2 qobject qmetaobject


    【解决方案1】:

    您的代码失败是因为返回getName 的变量不是QObject 而是str,类似于返回getAgeint,因此解决方案是设置正确的签名

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2012-09-20
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多