QTableView - 将第一列设置为“只读”

3

我有一个基于QStandardItemModel的QTableView。我想将第一列设置为“只读”,而其他所有列都可以编辑。

我不是QT和OOP的专家,我在网上搜索了一下并查看了QT文档,我理解我需要重新实现我的模型的flags(const QModelIndex& index)函数,但我不知道如何以及在哪里重新实现它。

提前致谢!


1
你目前有什么进展了吗? - SBH
我认为重新实现应该像这样:if (index.column() == 1) { return QAbstractModel::flags() & ~Qt::ItemIsEditable; }但我不知道把这段代码放在哪里。 - splunk
1个回答

5

您需要创建一个继承自QStandardItemModel的新类,重新实现flags方法,并使用您的新类代替标准类。

class MyModel : public QStandardItemModel
{
public:
    virtual Qt::ItemFlags flags(const QModelIndex& index) const override
    {
       Qt::ItemFlags result = QStandardItemModel::flags(index);
       if (index.column() == 0) //0 is the first column!
       {
           result &= ~Qt::ItemIsEditable;
       }
       return result;
    }
}

另外一种实现相同功能的方式:
- 创建一个继承自QStandardItem的新类,
- 以相同的方式重新实现flags方法,
- 使用新类的实例调用QStandardItemModel::setItemPrototype方法。
这种方式稍微有些复杂,因为您还需要重新实现QStandardItem::clone方法。


你的意思是 result |= ~Qt::ItemIsEditable; 吗?我认为我们需要使用 OR 运算符。 - Yousuf Azad
@sami1592 不,我们应该移除 editable 标志。|= 将启用所有标志。 - Ezee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接