如何禁用基于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; 
} 

Complete model class here

可悲的是QtQuick2 ListVie而而QListView不能完全忽略这个标志:

Left: QtWidgets QListView, Right: QtQuick2 ListView

我想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。

+0

我真的想控制,从C++,我只是Implemeted一个它使用这种计算的例子。之后我的模型将查看数据库列。我想,我不能避免'另一个自定义角色::数据()'返回一个布尔值启用了,对不对? –

+1

@DanielBrunner如果您的谓词依赖于模型数据,那么正确的方法是将这些数据作为模型角色共享,并用它在您的QML中构建表示逻辑,而不是在您的模型中。 – AnatolyS

+0

Qml是否使用标志?我的意思是它忽略了'ItemIsUserCheckable'和'ItemIsEnabled'。它看起来只有小部件的意见跟着他们! –