我有一个基于QStandardItemModel的QTableView。我想将第一列设置为“只读”,而其他所有列都可以编辑。
我不是QT和OOP的专家,我在网上搜索了一下并查看了QT文档,我理解我需要重新实现我的模型的flags(const QModelIndex& index)函数,但我不知道如何以及在哪里重新实现它。
提前致谢!
我有一个基于QStandardItemModel的QTableView。我想将第一列设置为“只读”,而其他所有列都可以编辑。
我不是QT和OOP的专家,我在网上搜索了一下并查看了QT文档,我理解我需要重新实现我的模型的flags(const QModelIndex& index)函数,但我不知道如何以及在哪里重新实现它。
提前致谢!
您需要创建一个继承自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 Azadeditable
标志。|=
将启用所有标志。 - Ezee
if (index.column() == 1) { return QAbstractModel::flags() & ~Qt::ItemIsEditable; }
但我不知道把这段代码放在哪里。 - splunk