ZBLOG

还有其它方法吗

除了通过自定义模型的方法,您还可以使用以下几种方式使 QTreeView 不可编辑:

1. 使用 setEditTriggers 方法

QTreeView 提供了 setEditTriggers 方法,可以设置在何种情况下允许编辑。将其设置为不允许任何触发条件,可以使树视图不可编辑。

#include <QApplication>
#include <QTreeView>
#include <QStandardItemModel>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QStandardItemModel model;
    model.setHorizontalHeaderLabels(QStringList() << "Items");

    // 添加数据
    for (int i = 0; i < 3; ++i) {
        QStandardItem *item = new QStandardItem(QString("Item %1").arg(i));
        model.appendRow(item);
    }

    // 创建树视图并设置模型
    QTreeView treeView;
    treeView.setModel(&model);

    // 设置不可编辑
    treeView.setEditTriggers(QAbstractItemView::NoEditTriggers);

    treeView.show();

    return app.exec();
}

2. 在视图中重写 mousePressEvent

如果需要更细粒度的控制,例如对某些特定项进行控制,可以通过重写 mousePressEvent 来阻止用户开始编辑操作。

class MyTreeView : public QTreeView {
protected:
    void mousePressEvent(QMouseEvent *event) override {
        QModelIndex index = indexAt(event->pos());
        if (index.isValid()) {
            // 阻止鼠标点击导致的编辑行为
            setCurrentIndex(index);  // 可选:保持选中状态,但不进入编辑模式
        }
        // 不调用基类的实现,避免开始编辑
    }
};

3. 控制特定项的可编辑性

如果只想让部分项不可编辑,可以在模型中根据特定条件返回标志。例如:

class ConditionalEditableModel : public QStandardItemModel {
public:
    Qt::ItemFlags flags(const QModelIndex &index) const override {
        if (!index.isValid())
            return Qt::NoItemFlags;

        // 假设我们要让第一个项不可编辑,其它项可编辑
        if (index.row() == 0) 
            return QStandardItemModel::flags(index) & ~Qt::ItemIsEditable;

        return QStandardItemModel::flags(index);
    }
};

总结

以上方法各有优缺点,您可以根据具体需求选择合适的实现方式。如果整个视图都不希望被修改,使用 setEditTriggers 是最简单有效的方法。如果需要更复杂的行为,自定义模型或重写事件处理方法会更灵活。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21954

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?