У меня есть пользовательский 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);
}
}
Это одна из многих веских причин не использовать определение положения столбца в делегатах отображения. Если вы позволите пользователям переупорядочивать столбцы в представлении, это также является проблемой. Я не думаю, что это ошибка, но в прошлом я хотел, чтобы был способ назначить делегата по умолчанию на уровне модели элемента. Возможно, как роль или что-то в этом роде.
В любом случае, одним из простых обходных путей, если у вас есть контроль над данными, является сохранение идентификатора столбца / поля непосредственно в самих данных в качестве пользовательской роли данных, например, modelIndex.setData(FIELD_ONE, Qt::UserRole + 1)
(где FIELD_ONE
например, перечисление ваших столбцов). Тогда делегат может просто проверить эту роль и знать, что делать.