将自定义QItemDelegate与QSortFilterProxyModel一起使用

时间:2017-02-15 21:59:15

标签: c++ qt qabstractitemmodel qitemdelegate

我有一个自定义QSortFilterProxyModel,只显示表中的某些行和列。我还有一个自定义QItemDelegate来控制如何绘制表中的某些值。我只是将代理应用于需要它的列,问题似乎是当我让代理模型隐藏某些列时,它会弄乱代理。

例如,假设我有列A-G并且我将自定义委托应用于列F.

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);

我认为这有效,但这是唯一的解决方案吗?委托代理和代理模型类不能更好地协同工作似乎是错误,就像你可以在同一个模型上使用其中一个但不能同时使用它们一样。

2 个答案:

答案 0 :(得分:1)

您可以尝试for (int i = 0; i < proxy->columnCount(); ++i) { if (proxy->mapToSource(proxy->index(0, i)).column() == 6) { table->setItemDelegateForColumn(i, yourDelegate); } } 过滤索引(每列一个)并检查原始列并根据它设置相应的项目委托。

// exhibit a
{
  "exported_modules": ["a", "b"]
}
// exhibit b
{
  "name": "thing b"
}

答案 1 :(得分:0)

这是不在显示委托中使用列位置检测的众多好理由之一。如果您让用户在视图中重新排列列,那也是一个问题。我不认为这是一个错误,但我在过去曾希望有一种方法可以在项目模型级别分配默认委托。也许是角色或其他什么。

无论如何,如果您控制数据,一个简单的解决方法是将列/字段ID存储在数据本身中,作为自定义数据角色,例如, modelIndex.setData(FIELD_ONE, Qt::UserRole + 1)(例如,FIELD_ONE是列的一些枚举)。然后代表可以检查该角色并知道该怎么做。