1

私はTwitterクライアントを書いています。と を実装TweetItemTweetModelました。問題は、TweetItem呼び出されたに役割があることですoriginal。元のツイートを指すようにします。

更新: コードにタイプミスがありました。今、私はそれらを修正しました。

import sys
from PyQt4 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, 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:
            # self.original == <__main__.TweetItem object at 0x7fb703d95d40>
            return self.original
        else:
            return None


if __name__ == "__main__":
    model = TweetModel(TweetItem())
    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_()

しかし、QMLでは使用できません。値を取得しundefinedます。

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 } }
  } 
}

では、オブジェクトを a で返してrole使用することは可能ですか?

4

3 に答える 3

2

私の推測では、TweetItemオブジェクトへのアクセスではなく、オブジェクトから id を取得しようとして undefined になったのです。

ご覧のとおり、TweetItem でQAbstractItemModelの実装は単純に正しくありません。データ メソッドはインデックスを受け入れず、rowCount も実装しません。QAbstractItemModelインターフェイスを正しく実装する方法については、Qt のドキュメントを参照してください。

あなたが望むものを達成するための私のアドバイスは、代わりにQObjectをサブクラス化し、QML で使用する名前付きプロパティとして追加データを提供することです。QObject を QML にバインドする方法については、Qt ガイドラインのこのページを参照してください。

于 2013-04-15T23:35:59.533 に答える
0
  1. 正解:あなたが得undefinedたのは、あなたTweetItem.originalが実際にいるからNoneです。
  2. あなたが何を成し遂げようとしているのかはわかりませんが、考えられる誤解をいくつか取り除きたいと思います。QAbstractItemModelモデルクラスでもありますが、見るのは少し不思議です

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

そこの。

于 2013-03-10T14:55:32.607 に答える