使用带有QSortFilterProxymodel的自定义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);

我想这有效,但这是唯一的解决方案吗?似乎错误的是,代表和代理模型类不能很好地一起工作,就像您可以很好地使用一个或同一模型上的同一模型。

您可以在过滤索引上尝试mapToSource(每列一个),然后检查原始列并基于它设置相应的项目委托。

for (int i = 0; i < proxy->columnCount(); ++i) {
  if (proxy->mapToSource(proxy->index(0, i)).column() == 6) {
    table->setItemDelegateForColumn(i, yourDelegate);
  }
}

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

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

相关内容

  • 没有找到相关文章

最新更新