首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对QSortFilterProxyModel使用自定义QItemDelegate

对QSortFilterProxyModel使用自定义QItemDelegate
EN

Stack Overflow用户
提问于 2017-02-16 05:59:15
回答 2查看 710关注 0票数 1

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

代码语言:javascript
复制
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列。

代码语言:javascript
复制
A  C  D  E  F  G
----------------
o  o  o  o  o  X
o  o  o  o  o  X
o  o  o  o  o  X

我可以通过在视图上隐藏列来解决这个问题,而不是通过调用

代码语言:javascript
复制
table->setColumnHidden(B, true);

代理和代理模型类不能很好地协同工作,这似乎是一个错误,就像你可以在同一模型上使用其中的一个或另一个,但不是两者都能很好地工作。

EN

回答 2

Stack Overflow用户

发布于 2017-02-16 07:14:45

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

代码语言:javascript
复制
for (int i = 0; i < proxy->columnCount(); ++i) {
  if (proxy->mapToSource(proxy->index(0, i)).column() == 6) {
    table->setItemDelegateForColumn(i, yourDelegate);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2017-12-19 10:31:42

这是在显示委托中不使用列位置检测的众多原因之一。如果您允许用户在视图中重新排列列,这也是一个问题。我不认为这是一个bug,但我过去一直希望有一种方法可以在项目模型级别分配默认委托。也许是作为一个角色或者别的什么。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42260866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档