2010-04-05 9 views
6

Ich möchte jedem QTableWidgetItem, das in die Tabelle eingefügt wurde, zusätzliche Daten zuordnen, um diese Daten zukünftig zu verwenden, wenn auf ein Tabellenelement geklickt wird. Aber diese Daten sollten nicht sichtbar sein. Wie kann ich das machen?Qt - Wie verknüpfe ich Daten mit QTableWidgetItem?

+1

Dies ist eine meiner größten Beschwerden gegen Qt. Ich habe in den wenigen Monaten, in denen ich es verwende, noch einen einfachen Mechanismus gefunden, der analog zur Datenbindung in .NET ist. –

+0

Alle Qt-Anzeigeklassen (Bäume, Tabellen, Listen) basieren auf Model/View. Es ist einfach, das Backend-Modell nach Belieben zu erstellen. Es gibt nicht den One-Click-Link zu SQL, den Sie mit LINQ haben, aber es ist flexibler. –

+1

@Martin Ich nenne es "machbar", nicht "einfach" ... obwohl ich denke, es ist besser, als die Daten direkt an die Präsentation gebunden zu haben. –

Antwort

20

Sie können QTableWidgetItem::setData() wie so verwenden:

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

Wo myData ist ein unterstütztes QVariant Typ. Sie können QTableWidgetItem::data() verwenden, um den Wert abzurufen, den Sie speichern.

Wenn Sie mehrere benötigen, können Sie Qt::UserRole + 1, +2 usw. verwenden (Qt::UserRole ist "Die erste Rolle, die für anwendungsspezifische Zwecke verwendet werden kann."), Können Sie mehr über die anderen Typen lesen der Rollen here).

Wenn Sie einen benutzerdefinierten Typ speichern, der nicht standardmäßig von QVariant unterstützt wird, müssen Sie Ihren Typ beim Qt-Metaobjektsystem registrieren. Sehen Sie sich QMetaType für weitere Details an.

Wenn Sie eine ganze Zahl speichern, zum Beispiel wollte:

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

Bessere Antwort! –

+0

Wie kann ich mit der Funktion setData() eine Ganzzahl dem Tabellenelement zuordnen? Sollte ich folgendes tun: item.setData (Qt :: UserRole, myInteger)? – Narek

+0

Ich habe das Beispiel geändert, um klarer zu sein, hoffe es hilft. – richardwb

5

Sie könnten von QTableItem ableiten und Ihre eigenen Daten Mitglied zur Verfügung stellen, oder Sie können die QTableView mit Ihrem eigenen Modell verwenden.

+1

Aus meiner Erfahrung ist dies viel flexibler als setData Daten Qt Funktionen – drahnr

+1

Ja, aber Richards Antwort ist wahrscheinlich einfacher für einen Anfänger - oder wenn Sie nur versuchen, einige MFC-Code zu übersetzen –