2017-02-15 124 views
1

我有一個自定義QSortFilterProxyModel只顯示錶中的某些行和列。我也有一個自定義QItemDelegate來控制如何繪製表中的某些值。我只是將委託應用到需要它的列,問題似乎是,當我有代理模型隱藏某些列時,它會弄亂委託。與QSortFilterProxyModel使用自定義QItemDelegate

例如,假設我有列AG和我申請我的自定義委託給列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); 

我假設的作品,但是是唯一的解?這似乎是錯誤的,委託和代理模型類不能更好地在一起工作,就像你可以使用一個或另一個,但不是在同一個模型上都很好。

+0

據我所知,它按預期工作:項目委託被應用到視圖的列,這應該是模型不可知的。此外,您的模型*是代理模型,因此它正在應用於正確的列。 – cbuchart

+0

我想你是對的@cbuchart。我想這是有道理的,當我在視圖上調用setItemDelegateForColumn時,它將是我指定的視圖列,而不是模型的列。如果您知道您使用的代理模式可能會更改列號,我認爲您的建議答案將是一個有效的解決方法。 – Moohasha

+0

您可以執行qobject_cast來檢查模型是否爲代理模型。 – cbuchart

回答

1

您可以嘗試mapToSource過濾索引(每列一個)並檢查原始列並根據它設置相應的項目委託。

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

這看起來好像會起作用,我不得不這樣看起來很奇怪。我期望視圖或代理模型會自動做到這一點。我會給它一個鏡頭,如果它按預期工作,我會接受它作爲答案。 – Moohasha

+0

是的,遺憾的是它不會是自動的,或者至少模型能夠以建議其他角色(如文本對齊)的相同方式建議項目委託。 – cbuchart

+0

@Mahasha它解決了你的問題嗎? – cbuchart

0

這是在顯示代表中不使用列位置檢測的許多好理由之一。如果讓用戶在視圖中重新排列列,那也是一個問題。我不認爲這是一個錯誤,但我希望在過去有一種方法可以在項目模型級別分配默認代理。也許作爲一個角色或什麼。

無論如何,如果您擁有對數據的控制權,一個簡單的解決方法是將數據本身的列/字段ID作爲自定義數據角色存儲在數據本身中。 modelIndex.setData(FIELD_ONE, Qt::UserRole + 1)(其中FIELD_ONE是您列的一些枚舉)。然後,代表可以檢查該角色並知道該怎麼做。

相關問題