2010-04-05 9 views
6

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

+1

Это одна из моих самых больших жалоб на Qt. Я еще не нашел, за несколько месяцев, которые я использовал, простой механизм, аналогичный привязке данных в .NET. –

+0

Все классы отображения элементов Qt (деревья, таблицы, списки) основаны на модели/представлении, легко сделать бэкэнд-модель чем угодно. В LINQ нет одной ссылки на SQL, но она более гибкая. –

+1

@Martin Я называю это «выполнимым», а не «легким» ... хотя, я думаю, это лучше, чем данные, привязанные непосредственно к презентации. –

ответ

20

Вы можете использовать QTableWidgetItem::setData() так:

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

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

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

Если вы сохраняете нестандартный тип, который не поддерживается 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); 
+1

Лучший ответ! –

+0

Как я могу связать целое число с элементом таблицы с помощью функции setData()? Должен ли я выполнять следующие действия: item.setData (Qt :: UserRole, myInteger)? – Narek

+0

Я изменил пример, чтобы быть более ясным, надеюсь, что это поможет. – richardwb

5

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

+1

По моему опыту это намного более гибко, чем setData data Функции Qt – drahnr

+1

Да, но ответ Ричард, вероятно, проще для новичков - или если вы просто пытаетесь перевести некоторый код MFC –