Qt - 如何将QTableView的特定列设为不可编辑?

时间:2012-09-27 07:26:58

标签: c++ qt delegates qtableview qt4.7

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

我该怎么办?

先谢谢。

5 个答案:

答案 0 :(得分:8)

您可以使用setItemDelegateForColumn()功能。实现只读委托,并为您需要的列设置它。

您还可以在模型中使用the flags,并删除特定列的Qt::ItemIsEditable标记。

答案 1 :(得分:6)

这样的事情也可能会这样做:

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));
}

答案 2 :(得分:1)

可能会迟到,但供将来参考。您应该将表格视图设置为NoEditTrigger,如下所示:

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

答案 3 :(得分:0)

在覆盖方法中,只需将其更改为if(!(index.column() == 0),然后将Flag值更改为Flag |= Qt::ItemisEditable
此工作正常。

答案 4 :(得分:0)

您需要覆盖'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;
}