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
Zugriff auf subclass von QTableWidgetItem
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ich hab das mal auf das Notwendige beschränkt.
Das ist die abgeleitete Klasse:
Diese Funktion reagiert auf ein Ereigniss in dem TableWidget.
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
Das ist die abgeleitete Klasse:
Code: Alles auswählen
class dateItem : public QTableWidgetItem
{
public:
dateItem();
void setDate(QDate d);
QDate getDate();
private:
QDate date;
};
Code: Alles auswählen
void table::cellSelected(int r, int c) {
dateItem *tag = new dateItem;
tag = this->item(r,c);
QDate d = tag->getDate();
}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
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.
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.
Naja, ich habe in einem anderem Zusammenhang (QTableView) mit dem QSqlQueryModel gearbeiten und fand das sehr nützlich.Dann solltest du vllt. darüber nachdenken, gleich ein ordentliches, sauberes eigenes Model zu schreiben.
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
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 findenAlexDu 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.
Es ist für das erste Verstehen etwas komplexer als ein QTableWidget mit Items zu füttern, aber dann umso mächtiger.