我试图在 Python 中的角色中返回一个对象,并在 QML 中获取另一个对象的引用。最后,我发现我可以用Property
它来做。
但是,我想获得 QML 中另一个对象的另一个引用的引用,PyQt 只是段错误。我切换到 PySide,但运行它时它仍然崩溃。
我做错了什么吗?
广发银行说
Cannot access memory at address 0xb
Cannot access memory at address 0x3
主文件
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
}
}
}
}