gpt4 book ai didi

python - 尝试获取 QML 中的子子属性时出现 PyQt 段错误

转载 作者:行者123 更新时间:2023-11-30 23:36:52 26 4
gpt4 key购买 nike

我试图 Return an object in a role in Python and get a reference of another object in QML 。最后,我发现我可以使用 Property 来做到这一点。

但是,我想获取 QML 中另一个对象的另一个引用的引用,PyQt 只是段错误。我切换到 PySide,但运行时它仍然崩溃。

我是不是做错了什么?

GDB表示

Cannot access memory at address 0xb
Cannot access memory at address 0x3

main.py

import sys
from PySide import QtCore, QtGui, QtDeclarative
from PySide.QtCore import Property, Signal, QObject


class TweetModel(QtCore.QAbstractListModel):
def __init__(self, prototype, parent=None):
QtCore.QAbstractListModel.__init__(self, parent)
self.setRoleNames(prototype.roles)
self.tweets = []

def appendRow(self, item):
self.tweets.append(item)

def rowCount(self, parent=QtCore.QModelIndex()):
return len(self.tweets)

def data(self, index, role):
return self.tweets[index.row()].data(role)


class UserItem(QtCore.QObject):
def __init__(self, item, parent=None):
super(UserItem, self).__init__()
self._data = item

@QtCore.Property(str)
def name(self):
return self._data.get('name')


class TweetItem(QObject):
roles = {
QtCore.Qt.UserRole + 1: 'id',
QtCore.Qt.UserRole + 6: 'original',
}

id_changed = Signal()

def __init__(self, id=None, original=None, author=None, parent=None):
QObject.__init__(self, parent=parent)

self._data = {'original': original,
'id': id, 'author': author}

def data(self, key):
return self._data[self.roles[key]]

@Property(str, constant=True)
def id(self):
return self._data['id']

@Property(QtCore.QObject, constant=True)
def original(self):
return self._data['original']

@Property(QtCore.QObject, constant=True)
def author(self):
return UserItem(self._data['author'])

if __name__ == "__main__":
model = TweetModel(TweetItem)
item = TweetItem("0001", None, {'name': 'test'}, model)
item_2 = TweetItem("0002", item, None, model)
item_3 = TweetItem("0003", item_2, None, model)
model.appendRow(item_3)

App = QtGui.QApplication(sys.argv)
view = QtDeclarative.QDeclarativeView()
view.rootContext().setContextProperty("mymodel", model)
view.setSource(QtCore.QUrl.fromLocalFile("main.qml"))
view.show()
App.exec_()

main.qml

import QtQuick 1.0

Rectangle {
width: 360
height: 360

ListView {
anchors.fill: parent
model: mymodel
delegate: Item {
Text {
text: id + " " + original.id + " " + original.original.author.name
}
}
}
}

最佳答案

我认为这是garbage collection问题。

您在 author 方法中创建的 UserItem 不会在 Python 代码中的任何地方被引用,并且会被垃圾收集。

为了避免这种情况,您可以在 main 中创建 UserItem:

item = TweetItem("0001", None, UserItem({'name': 'test'}), model)

或在创建时将其存储在 TweetItem 中:

if not self._author:
self._author = UserItem(self._data['author'])
return self._author

我可能会采用第一种方法,或者将 dict 传递给 TweetItem 并将其转换为 __init__ 中的 UserItem:

self._data = {'original': original,
'id': id, 'author': UserItem(author)}

关于python - 尝试获取 QML 中的子子属性时出现 PyQt 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16112136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com