Qt Jambi中基于自定义QAbstractItemModel实现QTreeView的问题
Qt Jambi自定义QAbstractItemModel实现树形视图的问题
我想在Qt中用Java实现一个树形视图,展示如下结构:
+ Category A | + Category AB | | Item AB | \ Item A + Category B | \ Item B \ Item
我参考Qt的Simple Tree Model示例来实现自定义QAbstractItemModel,但遇到Qt Jambi对QModelIndex的包装问题:无法像C++示例那样直接创建QModelIndex实例,而且该类似乎缺失了isValid()和internalPointer()等关键方法的包装。
以下是我目前的实现代码:
TreeModel类
package playground; import io.qt.core.*; import java.util.stream.Stream; public final class TreeModel extends QAbstractItemModel { private final TreeItem rootItem; public TreeModel(QString data, QObject parent) { super(parent); rootItem = new TreeItem(Stream.of(tr("Title"), tr("Summary")).map(QVariant::new).toList(), null); setupModelData(data.split('\n'), rootItem); } private void setupModelData(QStringList split, TreeItem rootItem) { //TODO } @Override public QModelIndex index(int row, int column, QModelIndex parent) { if(!hasIndex(row, column, parent)) { return new QModelIndex(); } var parentItem = !parent.isValid() ? rootItem : parent.internalPointer(); var child = parentItem.child(row); return child != null ? createIndex(row, column, childItem) : new QModelIndex(); } @Override public QModelIndex parent(QModelIndex index) { if(!index.isValid()) { return new QModelIndex(); } var childItem = index.internalPointer(); var parentItem = childItem.parentItem(); if(parentItem == rootItem) { return new QModelIndex(); } return createIndex(parentItem.row(), 0, parentItem); } @Override public int rowCount(QModelIndex parent) { if(parent.column() > 0) { return 0; } var parentItem = !parent.isValid() ? rootItem : parent.internalPointer(); return parentItem.childCount(); } @Override public int columnCount(QModelIndex parent) { return (parent.isValid() ? parent.internalPointer() : rootItem).columnCount(); } @Override public Object data(QModelIndex index, int role) { if(!index.isValid()) { return new QVariant(); } if(role != Qt.ItemDataRole.DisplayRole) { return new QVariant(); } var item = index.internalPointer(); return item.data(index.column()); } @Override public Qt.ItemFlags flags(QModelIndex index) { return !index.isValid() ? new Qt.ItemFlags() : index.flags(); } @Override public Object headerData(int section, Qt.Orientation orientation, int role) { if(orientation == Qt.Orientation.Horizontal && role == Qt.ItemDataRole.DisplayRole) { return rootItem.data(section); } return new QVariant(); } }
TreeItem类
package playground; import io.qt.core.QVariant; import java.util.ArrayList; import java.util.List; import java.util.Objects; public final class TreeItem { private final List<TreeItem> childItems = new ArrayList<>(); private final List<QVariant> itemData = new ArrayList<>(); private final TreeItem parentItem; public TreeItem(List<QVariant> data, TreeItem parent) { this.itemData.addAll(data); this.parentItem = parent; } public void appendChild(TreeItem child) { Objects.requireNonNull(child); childItems.add(child); } public TreeItem child(int row) { if(row < 0 || row >= childItems.size()) { return null; } return childItems.get(row); } public int childCount() { return childItems.size(); } public int columnCount() { return itemData.size(); } public QVariant data(int column) { if(column < 0 || column >= itemData.size()) { return null; } return itemData.get(column); } public int row() { if(parentItem != null) { return parentItem.childItems.indexOf(this); } return 0; } public TreeItem parentItem() { return parentItem; } }
内容的提问来源于stack exchange,提问作者gudenau
相关产品推荐
相关产品推荐

