如何使 QTableView 的特定列不可编辑?

问题描述 投票:0回答:6

我有一个

QTableView
,有 4 行和 4 列,每行代表其中的数据。默认情况下,
QTableView
是可编辑的。现在,我想在我的
QTableView
中将任何特定列设置为不可编辑。

我该怎么做?

c++ qt qtableview
6个回答
13
投票

您可以使用

setItemDelegateForColumn()
功能。实现一个只读委托,并将其设置为您需要的列。

您还可以在模型中使用 the flags,并删除特定列的

Qt::ItemIsEditable
标志。


12
投票

类似的事情也可以做到:

class NotEditableDelegate : public QItemDelegate
{
    Q_OBJECT
public:
    explicit NotEditableDelegate(QObject *parent = 0)
        : QItemDelegate(parent)
    {}

protected:
    bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
    { return false; }
    QWidget* createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const
    { return Q_NULLPTR; }

};

使用中:

// Make all the columns except the second read only
for(int c = 0; c < view->model()->columnCount(); c++)
{
    if(c != 1)
        view->setItemDelegateForColumn(c, new NotEditableDelegate(view));
}

6
投票

最简单的方法是设置您不想以这种方式编辑的项目的标志:

item->setFlags(item->flags() &  ~Qt::ItemIsEditable);

您还可以查看此线程:Qt 如何使 QTableWidget 中的列只读


1
投票

可能会这么晚,但仅供将来参考。您应该将表格视图设置为

NoEditTrigger
,如下所示:

myTableView->setModel(model);
myTableView->setEditTriggers(QAbstractItemView::NoEditTriggers)

1
投票

在覆盖方法中,只需将其更改为

if(!(index.column() == 0)
并将
Flag
值更改为
Flag |= Qt::ItemisEditable

这很好用。


1
投票

您需要覆盖'flags'方法并指定所选列的元素的可编辑性参数

Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
{
    if(!index.isValid())
        return Qt::NoItemFlags;
    if(index.column() == SELECTED_COLUMN_NUM)
    {
        return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
    }
    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}
© www.soinside.com 2019 - 2024. All rights reserved.