如何禁用基于QAbstractListModel ListView中某些项目?
问题描述:
我有一个QAbstractListModel
C++模型类和QtQuick2 ListView
。如何禁用基于QAbstractListModel ListView中某些项目?
出于测试目的,我也创建一个QtWidgets QListView
并连接到相同的模型进行比较。
我想告诉哪些项目应使用重载QAbstractListModel::flags()
在这个例子中禁用的观点一样,:
Qt::ItemFlags flags(const QModelIndex& index) const
{
Qt::ItemFlags f = QAbstractListModel::flags(index);
if(index.isValid())
{
f |= Qt::ItemIsUserCheckable;
if(index.row() % 3 == 2)
f &= ~Qt::ItemIsEnabled;
}
return f;
}
可悲的是QtQuick2 ListVie而而QListView不能完全忽略这个标志:
我想ITEM2和ITEM5是存款保险计划还能够在QtQuick2中使用。如何实现这一目标?
答
如果使用CheckDelegate你应该通过委托性质调整它:
delegate: CheckDelegate {
text: model.display
checked: model.checkState
enabled: <here is your predicate, for example "index % 2" for each odd item>
}
正是由于QML使用不同的方法来在相反的数据可视化,以QWidgets。
我真的想控制,从C++,我只是Implemeted一个它使用这种计算的例子。之后我的模型将查看数据库列。我想,我不能避免'另一个自定义角色::数据()'返回一个布尔值启用了,对不对? –
@DanielBrunner如果您的谓词依赖于模型数据,那么正确的方法是将这些数据作为模型角色共享,并用它在您的QML中构建表示逻辑,而不是在您的模型中。 – AnatolyS
Qml是否使用标志?我的意思是它忽略了'ItemIsUserCheckable'和'ItemIsEnabled'。它看起来只有小部件的意见跟着他们! –