QListView/QListWidget

Alles rund um die Programmierung mit Qt
Antworten
derdani

QListView/QListWidget

Beitrag 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ß.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag 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 ;)
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag 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

Code: Alles auswählen

data ( const QModelIndex &, int ) const : QVariant
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!
derdani

Beitrag 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! :-)
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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 ...
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
derdani

Beitrag 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.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

setColumnHidden() setzt meines Wissens die Spaltenbreite auf 0. Und dies dann auch noch für jede View machen, ist nicht das optimalste...
padreigh
Beiträge: 340
Registriert: 13. Mai 2010 10:06

Beitrag 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
Patrick (QtCreator 1.3.1, Qt 4.6.3)
---
template = subdirs
derdani

Beitrag 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!
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Dafür ist es flexibler als in Java.
Antworten