【问题标题】:Disable only one item in QTreeWidget仅禁用 QTreeWidget 中的一项
【发布时间】:2015-06-17 13:39:31
【问题描述】:

我有一个 QTreeWidget,它可以有很多行但只有 3 列:

在图片中,我选择了我的最后一列。我想做的是禁用树中每个项目的最后一列,除非它被选中。所以在我的情况下,只有 pidtest.xml 项目会启用复选框。我不知道如何使用现有方法来做到这一点。我将获得所有帮助!

【问题讨论】:

  • 您可以尝试使用QTableWidgetItem::setFlags() 函数并从未选中的项目中删除Qt::ItemIsEnabled 标志。
  • ¿您将如何将它们设置为再次启用?只是好奇。
  • 准确地说,如果我禁用整行,我将无法再次打开。我只需要禁用行中的最后一项。
  • QTreeWidgetItem 不支持部分禁用。尝试使用QTreeView 和QStandardItemModel。

标签: c++ qt qtreewidget


【解决方案1】:

这里有一个完整的工作示例,说明如何做到这一点。

正如 Pavel Strakhov 所指出的,该示例使用 QTreeView,因为 QTreeWidgetItem 不支持“部分禁用”。

在示例中显示一个 TreeView,显示 2 列(名称,启用)。只有当第二列为真时,您才能编辑第一列。

示例中没有更改值的实现,您必须将 setData 函数添加到模型中才能做到这一点。

完整示例:

#include <QtWidgets/QApplication>
#include <QTreeView>
#include <QAbstractTableModel>
#include <QString>
#include <QVariant>
#include <QList>

typedef struct entry_{
    entry_(const QString &n, bool e) : name(n), enabled(e) {}
    QString name; bool enabled;
} table_entry_t;

class SimpleModel : public QAbstractTableModel
{
public:
    SimpleModel(QWidget *parent = nullptr) : QAbstractTableModel(parent)
    {
        m_entries = {
            {"Jhon Doe", false},
            {"Jhon Doe Jr.", true}
        };
    }

    QVariant data(const QModelIndex &index, int role) const {
        switch (role) {
        case Qt::DisplayRole:
            table_entry_t entry = m_entries[index.row()];
            if (index.column() == 0)
                return QVariant(entry.name);
            if (index.column() == 1)
                return QVariant(entry.enabled);
        }
        return QVariant();
    }

    Qt::ItemFlags flags(const QModelIndex &index) const {
        Qt::ItemFlags flags = QAbstractTableModel::flags(index);
        if (!m_entries[index.row()].enabled && index.column() == 0)
            flags ^ Qt::ItemIsEnabled;
        else
            flags |= Qt::ItemIsEditable;
        return flags;
    }

    int rowCount(const QModelIndex &parent /* = QModelIndex() */) const {Q_UNUSED(parent); return static_cast<int>(m_entries.size());}
    int columnCount(const QModelIndex &parent /* = QModelIndex() */) const {Q_UNUSED(parent); return 2; }

private:
    QList<table_entry_t> m_entries;
};


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTreeView tree;
    SimpleModel *model = new SimpleModel();
    tree.setModel(model);
    tree.show();
    return a.exec();
}

【讨论】:

    猜你喜欢
    • 2023-02-23
    • 2011-12-22
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多