我有一个自定义的QSortFilterProxyModel,它只显示表中的某些行和列。我还有一个自定义的QItemDelegate来控制表中某些值的绘制方式。我只将委托应用于需要它的列,问题似乎是,当我让代理模型隐藏某些列时,它会使委托变得混乱。
A B C D E F G
-------------------
o o o o o X o
o o o o o X o
o o o o o X o如果我的代理模型没有显示B列,那么我的代理最终将应用于G列。
A C D E F G
----------------
o o o o o X
o o o o o X
o o o o o X我可以通过在视图上隐藏列来解决这个问题,而不是通过调用
table->setColumnHidden(B, true);代理和代理模型类不能很好地协同工作,这似乎是一个错误,就像你可以在同一模型上使用其中的一个或另一个,但不是两者都能很好地工作。
发布于 2017-02-16 07:14:45
您可以在过滤后的索引(每列一个)上尝试mapToSource,并检查原始列并根据它设置相应的项委托。
for (int i = 0; i < proxy->columnCount(); ++i) {
if (proxy->mapToSource(proxy->index(0, i)).column() == 6) {
table->setItemDelegateForColumn(i, yourDelegate);
}
}发布于 2017-12-19 10:31:42
这是在显示委托中不使用列位置检测的众多原因之一。如果您允许用户在视图中重新排列列,这也是一个问题。我不认为这是一个bug,但我过去一直希望有一种方法可以在项目模型级别分配默认委托。也许是作为一个角色或者别的什么。
无论如何,如果您可以控制数据,一个简单的解决方法是将列/字段ID存储在数据本身中,作为自定义数据角色,例如modelIndex.setData(FIELD_ONE, Qt::UserRole + 1) (其中FIELD_ONE是列的某个枚举)。然后,代理可以只检查该角色并知道要做什么。
https://stackoverflow.com/questions/42260866
复制相似问题