QListView/QListWidget
-
derdani
QListView/QListWidget
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ß.
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ß.
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
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
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.
Außerdem reimplementierst du einige methoden, z.b. die methode
Beispiel:
Damit zeigst du in der liste die namen an, hast aber in der struktur name und id gespeichert!
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;
}Code: Alles auswählen
data ( const QModelIndex &, int ) const : QVariantCode: 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();
}
-
derdani
-
derdani
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
-
derdani