2017-02-15 22 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

フィルタリングされたインデックス(1列に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

@Moohashaそれはあなたの問題を解決しましたか? – cbuchart

0

これは、表示代理人で列位置検出を使用しない理由の多くの1つです。ユーザーがビュー内の列を再配置できるようにすると、それも問題になります。私はそれがバグだとは思わないが、過去に、アイテムモデルレベルでデフォルトのデリゲートを割り当てる方法があることを望んでいた。おそらく役割や何かとして。

とにかく、データを管理している場合は、データ自体に列/フィールドIDをカスタムデータの役割として格納することです(例: modelIndex.setData(FIELD_ONE, Qt::UserRole + 1)(たとえば、FIELD_ONEは列の列挙型です)。デリゲートは、その役割を確認して何をすべきかを知ることができます。

関連する問題