Qt - Как связать данные с QTableWidgetItem?

Я хочу связать дополнительные данные с каждым QTableWidgetItem, вставленным в таблицу, чтобы использовать эти данные в будущем при нажатии на элемент таблицы. Но эти данные не должны быть видны. Как я могу это сделать?


person Narek    schedule 05.04.2010    source источник
comment
Это одна из моих самых больших претензий к Qt. За те несколько месяцев, что я его использую, мне еще предстоит найти простой механизм, аналогичный привязке данных в .NET.   -  person San Jacinto    schedule 05.04.2010
comment
Все классы отображения элементов Qt (деревья, таблицы, списки) основаны на модели/представлении, легко сделать модель бэкэнда какой угодно. В LINQ нет ссылки на SQL одним щелчком мыши, но она более гибкая.   -  person Martin Beckett    schedule 06.04.2010
comment
@Martin Я называю это осуществимым, а не простым ... хотя я думаю, что это лучше, чем привязка данных непосредственно к презентации.   -  person San Jacinto    schedule 09.04.2010
comment
@ Сан-Хасинто - возможно, лучше сказать «разумный»! ;-)   -  person Martin Beckett    schedule 09.04.2010


Ответы (2)


Вы можете использовать QTableWidgetItem::setData() следующим образом:

setData(Qt::UserRole, myData); // set

Где myData — это поддерживаемый тип QVariant. Вы можете использовать QTableWidgetItem::data() для получения сохраненного значения.

Если вам нужно больше одной роли, вы можете использовать Qt::UserRole + 1, + 2 и т. д. (Qt::UserRole – это «Первая роль, которую можно использовать для конкретных целей приложения», подробнее о других типах ролей можно прочитать здесь).

Если вы сохраняете пользовательский тип, который изначально не поддерживается QVariant, вам нужно будет зарегистрировать свой тип в системе метаобъектов Qt. Подробнее см. QMetaType.

Если вы хотите сохранить целое число, например:

QTableWidgetItem* widgetItem = tableWidget->item(row, col); // get the item at row, col
int myInteger = 42;
widgetItem->setData(Qt::UserRole, myInteger);
// ...
myInteger = widgetItem->data(Qt::UserRole);
person richardwb    schedule 05.04.2010
comment
Как связать целое число с элементом таблицы с помощью функции setData()? Должен ли я сделать следующее: item.setData(Qt::UserRole, myInteger)? - person Narek; 05.04.2010
comment
Большое спасибо! Я использовал эту функцию, но с другими ролями Qt, и эффект был не тем, что я хотел, поэтому я запутался! Спасибо! - person Narek; 05.04.2010
comment
Если вы добавляете более 2 элементов данных в каждый элемент таблицы, становится проще создать модель и вместо этого использовать QTableView, IMO. - person Caleb Huitt - cjhuitt; 06.04.2010

Вы можете получить от QTableItem и предоставить свой собственный член данных, или вы можете использовать QTableView со своей собственной моделью.

person Martin Beckett    schedule 05.04.2010
comment
По моему опыту, это гораздо более гибко, чем функции setData data Qt. - person drahnr; 06.04.2010
comment
Да, но ответ Ричарда, вероятно, проще для новичка - или если вы просто пытаетесь перевести какой-то код MFC. - person Martin Beckett; 06.04.2010
comment
Для тех, кто будет читать в будущем, QTableItem теперь называется QTableWidgetItem и поддерживает еще подклассы. - person LolPython; 18.02.2020