2

我试图在 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
            } 
        }
    } 
} 
4

1 回答 1

4

我认为这是垃圾收集问题。

UserItemauthor方法中创建的你之后在 python 代码中的任何地方都不会被引用,并且会被垃圾收集。

为避免这种情况,您可以UserItem在您的main:

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

TweetItem在创建时将其存储:

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

我可能会采用第一种方式,或者将 dict 传递给 theTweetItem并将其转换为UserItemin __init__

self._data = {'original': original,
        'id': id, 'author': UserItem(author)}
于 2013-04-19T20:06:11.763 回答