You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:15:31