Qt 5 の未来は明るいブログ

QtQuick.XmlListModel 2.0 でアイテムが追加された場合の処理を書く

Published: 2013-04-30 / Last modified: 2013-04-30

ちょっと古いネタですが、この間会った時 に同じことを言っていた気がしたのでブログに書いておく。

QtQuick 1.0 の XmlListModel の実装は QDeclarativeXmlListModel というクラスで行われており、モデルとしてのインターフェースは基底クラスの QListModelInterface になります。このクラスは void itemsInserted(int index, int count); というシグナルを持っており、XmlListModel のデータが増えた際にこのシグナルが発生するため、(ドキュメントに載っていないため公式な API ではありませんが) onItemInserted: というハンドラで処理を行うことができました。

QtQuick 2.0 では、XmlListModel の再実装が行われ、QQuickXmlListModel というクラスに変わりました。アイテムの追加や削除は基底クラスの QAbstractListModel のさらに基底クラスの QAbstractItemModel がインターフェースになります。

というわけで、QtQuick 2.0 の XmlListModel の要素の追加時には void rowsInserted(const QModelIndex & parent, int start, int end) シグナルが発生するため、QML でハンドラを書く場合には onRowsInserted: の中で start と end を見て処理をするようになります。

確認に使ったソース

import QtQuick 2.0
import QtQuick.XmlListModel 2.0

GridView {
width: 360
height: 360
cellWidth: width / 3
cellHeight: height / 3

model: XmlListModel {
id: model
source: 'http://feeds.feedburner.com/TEDTalks_video'
query: '/rss/channel/item'
namespaceDeclarations:
"declare namespace media=\"http://search.yahoo.com/mrss/\";"

XmlRole { query: 'title/string()'; name: 'title' }
XmlRole { query: 'description/string()'; name: 'description' }
XmlRole { query: 'media:thumbnail/@url/string()'; name: 'icon'}
XmlRole { query: 'media:content/@url/string()'; name: 'content'}

onRowsInserted: {
console.debug('Inserted from: %1; to: %2'.arg(first).arg(last))
}
}

delegate: Image {
width: GridView.view.width / 3
height: GridView.view.height / 3
source: model.icon
fillMode: Image.PreserveAspectCrop
clip: true

Rectangle {
visible: parent.status === Image.Ready
anchors.left: parent.left
anchors.right: parent.right
anchors.bottom: parent.bottom
height: parent.height / 3
gradient: Gradient {
GradientStop { position: 1.0; color: '#000000' }
GradientStop { position: 0.0; color: 'transparent' }
}
Text {
anchors.fill: parent
verticalAlignment: Text.AlignBottom
color: 'white'
text: model.title
}
}
}
}