Использование пользовательских QItemDelegate с QSortFilterProxyModel

У меня есть пользовательский 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);

И я полагаю, что это работает, но это единственное решение? Кажется, что ошибка в том, что классы модели делегата и прокси не работают лучше вместе, так как вы можете использовать один или другой, но не оба в одной и той же модели.

1

Решение

Вы можете попробовать mapToSource на отфильтрованных индексах (по одному на столбец) и проверьте исходный столбец и установите соответствующий делегат элемента на его основе.

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

Другие решения

Это одна из многих веских причин не использовать определение положения столбца в делегатах отображения. Если вы позволите пользователям переупорядочивать столбцы в представлении, это также является проблемой. Я не думаю, что это ошибка, но в прошлом я хотел, чтобы был способ назначить делегата по умолчанию на уровне модели элемента. Возможно, как роль или что-то в этом роде.

В любом случае, одним из простых обходных путей, если у вас есть контроль над данными, является сохранение идентификатора столбца / поля непосредственно в самих данных в качестве пользовательской роли данных, например, modelIndex.setData(FIELD_ONE, Qt::UserRole + 1) (где FIELD_ONE например, перечисление ваших столбцов). Тогда делегат может просто проверить эту роль и знать, что делать.

0

По вопросам рекламы [email protected]