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