Seite 1 von 1
QListView/QListWidget
Verfasst: 22. November 2010 15:14
von derdani
Hallöchen,
ich habe folgendes Problem: angenommen es gibt eine Klasse Person mit einer id und einem Namen als Attribut. Diese sollen in eine Liste gefaltet werden, wobei der Name angezeigt wird, ich aber trotzdem noch auf die id zugreifen kann. Scheinbar ganz simples Problem ein Objekt in eine Liste zu packen aber ich kriegs nicht hin.
Habe QAbstractListModel bereits abgeleitet und verschiedenste Ansätze versucht, nur habe ich irgendwie das Gefühl, das es etwas an Verständnis mangelt, was die Funktionsweise der Datendarstellung in Qt anbelangt.
Und bitte nicht kommen mit "Class Reference lesen" und "Qt Examples durchschauen", ich arbeite ausschließlich mit der Qt Dokumentation bisher, nur werd ich was dies anbelangt daraus nicht schlau.
Wäre für einen Denkanstoß in höchstem Maße dankbar.
Gruß.
Verfasst: 22. November 2010 16:19
von pfid
Nimm der Einfachheit halber ein QListWidget, setz den QListWidgetItems den Text per setText(), und die id per setData(Qt::UserRole, id).
Wenn du noch mehr Spalten brauchst, nimm der Einfachheit halber ein QTreeWidget (gleiches Handling), und falls du viele Daten verwalten willst, nimm eine View + ein passendes Model.
Für alle 3 Varianten gibts hier
http://doc.trolltech.com/4.7/ ne ausführliche Doku

Verfasst: 22. November 2010 16:20
von Mani99
Also beim listview + listmodel läuft das ja so ab, das du von QAbstractListModel ableitest.
In dem model hast du irgendwas das die daten aufnimmt, z.b. eine QList.
Code: Alles auswählen
class MyModel : public QAbstractListModel
{
public:
//...
//...
private:
//im QPair erster eintrag name und zweiter eintrag id
QList<QPair<QString, QString> > my_data;
}
Außerdem reimplementierst du einige methoden, z.b. die methode
Beispiel:
Code: Alles auswählen
QVariant TableModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= my_data.size() || index.row() < 0)
return QVariant();
if (role == Qt::DisplayRole) {
QPair<QString, QString> pair = my_data.at(index.row());
if (index.column() == 0)
return pair.first;
}
return QVariant();
}
Damit zeigst du in der liste die namen an, hast aber in der struktur name und id gespeichert!
Verfasst: 22. November 2010 16:30
von derdani
Danke schonmal für die fixe Antwort. Ich werde mir bis morgen beide Ansätze ansehen und sehen ob ichs schaffe(ich hoffs doch).
Falls nicht, werd ich mich nochmal melden.
Also, schönen Tag noch!

Verfasst: 22. November 2010 19:30
von padreigh
spricht was dagegen mit setcolumnhidden(0) einfach die ID zu verstecken ? mit currentIndex kriegste die row raus und mit data(index(row,0)) kommste trotzdem dran ...
Verfasst: 23. November 2010 08:27
von derdani
Naja, weiß nicht ob das so gut ist, name/id war ja nur ein Beispiel, ich habe wesentlich komplexere Klassen mit mehr Attributen. Dann 19/20 Attributen hidden zu setzen scheint mir keine saubere Lösung zu sein. Aber ich lasse mich gerne eines Besseren belehren.
Verfasst: 23. November 2010 09:06
von upsala
setColumnHidden() setzt meines Wissens die Spaltenbreite auf 0. Und dies dann auch noch für jede View machen, ist nicht das optimalste...
Verfasst: 23. November 2010 18:00
von padreigh
stimmt ... er sprach aber zuerst von "einem Namen und einer ID und nur der Name soll sichtbar bleiben" ... bei 20 oder mehr wäre ein eigenes QAbstractItemModel sicher sinnvoller, in der data( ) einfach für die columns ein QVariant() zurückliefern die du IMMER ausblenden willst wenn die Qt::DisplayRole angefordert wird ... wenn Qt::UseRole(+x) angefordert wird gibtste dann halt den richtigen Wert zurück, damit kommst du immer an die Werte ran (halt unter der Qt::UserRole(+x) aber angezeigt werden sie nicht
Verfasst: 23. November 2010 20:40
von derdani
Danke für die Antworten! Ich setze mich die nächsten Tage mal mit Ableiten von AbstractModels auseinander. Die scheinen mir aber nicht ganz so einfach wie aus Java. Muss wohl nur mal "Klick" machen.
Schönen Abend,
Gruß aus Bayern!
Verfasst: 23. November 2010 20:49
von upsala
Dafür ist es flexibler als in Java.