Zugriff auf subclass von QTableWidgetItem

Alles rund um die Programmierung mit Qt
Antworten
AlexDu
Beiträge: 14
Registriert: 28. Januar 2009 14:08

Zugriff auf subclass von QTableWidgetItem

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was heisst erfolglos? Wie hast Du es probiert und wie genau hast Du von QTableWidgetItem abgeleitet?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AlexDu
Beiträge: 14
Registriert: 28. Januar 2009 14:08

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
AlexDu
Beiträge: 14
Registriert: 28. Januar 2009 14:08

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
AlexDu
Beiträge: 14
Registriert: 28. Januar 2009 14:08

Beitrag 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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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.
Antworten