Seite 1 von 1
Zugriff auf subclass von QTableWidgetItem
Verfasst: 5. August 2010 08:02
von AlexDu
Hallo,
vielleicht kann mir mal jemand auf die Sprünge helfen.
Ich habe ein QTableWidget und zwei subclasses von QTableWidgetItem mit denen ich das TableWidget fülle.
Jetzt möchte ich mit row und column wieder auf eine sublasse zugreifen.
Mit item(row,column) bekomme ich ja den Typ QTableWidgetItem zurück.
Alle Versuche dieses zu meiner subclass zu "casten" waren erfolglos.
Hat jemand eine Idee, wie ich das bewerkstelligen könnte?
Gruß Alex
Verfasst: 5. August 2010 08:22
von Christian81
Was heisst erfolglos? Wie hast Du es probiert und wie genau hast Du von QTableWidgetItem abgeleitet?
Verfasst: 5. August 2010 09:07
von AlexDu
Ich hab das mal auf das Notwendige beschränkt.
Das ist die abgeleitete Klasse:
Code: Alles auswählen
class dateItem : public QTableWidgetItem
{
public:
dateItem();
void setDate(QDate d);
QDate getDate();
private:
QDate date;
};
Diese Funktion reagiert auf ein Ereigniss in dem TableWidget.
Code: Alles auswählen
void table::cellSelected(int r, int c) {
dateItem *tag = new dateItem;
tag = this->item(r,c);
QDate d = tag->getDate();
}
In der Zeile:
tag = this->item(r,c);
kommt die Fehlermeldung;
Invalid conversation from 'QTableWidgetItem*' to 'dateItem*'
Wenn ich diese Zeile versuche:
tag = qobject_cast<dateItem *>(this->item(r,c));
kommt die Meldung:
no matching function for call to 'qobject_cast(QTableWidgetItem*)'
Gruß Alex
Verfasst: 5. August 2010 09:26
von franzf
qobjct_cast funktioniert nur bei Klassen, die von QObject abgeleitet sind. QTableWidgetItem ist das nicht. Wenn du nur deine eigenen Items einfügst, kannst du static_cast verwenden (Wisse was du tust!), der sichere Weg ist aber dynamic_cast und den return auf NULL prüfen.
Aber nur für diese QDate-Spezialisierung abzuleiten ist unnötig. Mach dir entweder zwei freie Funktionen "QDate getDate(QTableWidgetItem* item)" und "void setDate(QTableWidgetItem* item, const QDate& date)", oder du machst es mit den data/setData-Funktionen (arbeiten mit QVariant, und QDate kann in QVariant gespeichert und wieder extrahiert werden).
Oder du verwendest gleich das QStandardItemModel.
Verfasst: 5. August 2010 09:45
von AlexDu
Danke, dynamic_cast macht das was ich will. Ich hatte mich wohl zusehr in das qobject_cast verbissen um auf diese Möglichkeit zu stoßen.
Nein, ich hab noch mehr vor mit der abgeleiteten Klasse, und damit der Code verständlich bleibt würde ich das schon ganz gern so machen.
Danke nochmal, Alex
Verfasst: 5. August 2010 14:23
von franzf
AlexDu hat geschrieben:Nein, ich hab noch mehr vor mit der abgeleiteten Klasse, und damit der Code verständlich bleibt würde ich das schon ganz gern so machen.
Dann solltest du vllt. darüber nachdenken, gleich ein ordentliches, sauberes eigenes Model zu schreiben.
Verfasst: 5. August 2010 22:06
von AlexDu
Dann solltest du vllt. darüber nachdenken, gleich ein ordentliches, sauberes eigenes Model zu schreiben.
Naja, ich habe in einem anderem Zusammenhang (QTableView) mit dem QSqlQueryModel gearbeiten und fand das sehr nützlich.
Aber in diesem Fall sehe ich noch keinen Nutzen. Ich müßte ja auch die Items des Models ableiten für meinen Zweck. Vieleicht probier ich es mal parallel zum jetzigem Projekt.
Grüße Alex
Verfasst: 6. August 2010 08:07
von franzf
AlexDu hat geschrieben:Aber in diesem Fall sehe ich noch keinen Nutzen. Ich müßte ja auch die Items des Models ableiten für meinen Zweck.
Schau dir das mal genauer an, QAbstractItemModel kennt nämlich gar keine "Item"-Klasse. Du musst NUR eine einzige Klasse von QAbstractItemModel ableiten. Für deine Struktur im Hintergrund gibt es in createIndex() den internalPointer. Schau dir die Beispiele an, da wirst du einiges an Inspiration finden

Es ist für das erste Verstehen etwas komplexer als ein QTableWidget mit Items zu füttern, aber dann umso mächtiger.