[PySide] Fwd: How do I return an object in Python and use it in QML?
Tom Li
biergaizi2009 at gmail.com
Sat Mar 9 08:08:26 CET 2013
Well, I have no knowledge with JavaScript, or CSS. I just want to use
QML as a beautiful ListView.
I'm writing a Twitter client. I implemented TweetItem and TweetModel.
The issue is that there is a role in TweetItem called original. I want
it to point to the original tweet.
But I can not use it with "." operator in QML. I get an undefined value.
What is the right way to do it?
Thanks.
Here's my code.
main.py:
import sys
from PySide import QtCore, QtGui, QtDeclarative
class TweetModel(QtCore.QAbstractListModel):
def __init__(self, prototype, parent=None):
QtCore.QAbstractListModel.__init__(self, parent)
self.setRoleNames(prototype.roleNames())
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 TweetItem(QtCore.QAbstractItemModel):
def __init__(self, id=None, type=None, user=None, content=None,
time=None, original=None, parent=None):
QtCore.QAbstractItemModel.__init__(self, parent)
self.idRole = QtCore.Qt.UserRole + 1
# More Roles
self.originalRole = QtCore.Qt.UserRole + 6
self.id = id
self.original = original
def roleNames(self):
names = {}
names[self.idRole] = "id"
names[self.originalRole] = "original"
return names
def data(self, role):
if role == self.idRole:
return self.id
elif role == self.originalRole:
return self.original
else:
return QtCore.QVariant()
if __name__ = "__main__":
model = TweetModel(TweetItem(), QtGui.qApp)
item = TweetItem("0001", None, model)
model.appendRow(TweetItem("0002", item, model))
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
// original.id == undefined
delegate: Component { Text { text: id + " " + original.id } }
}
}
More information about the PySide
mailing list