qt: erweitertes ListView?



  • Hi ihr,

    ich habe folgendes Problem. Ich habe eine STL-List mit Objekten die unter anderem einen Namen haben. Ich will diese Objekte unter ihren Namen in ein QListView eintragen und wenn der User z.B. einen Doppelklick auf den Eintrag macht ein PopUp-Widget aufgeht wo er die Werte für das Objekt ändern kann. Das Problem ist wie finde ich die Objekte wieder?

    Um ein Bsp. zu geben:

    // Bsp Struktur
    
    struct myObject {
      myObject( QString name, int I ):Name( name ), i(I) {};
      ~myObject() {};
      QString Name;
      int i;
    }
    
    // Erzeugung
    
    typedef List<myObject> ObjectList;
    
    ObjectList objectList;
    QListView ListView( parent, "ListView" );
    
    // Füllen der List und des ListView
    
    for( int i = 1; i<11; ++i ) {
      myObject* tmp = new myObject( "gleicher Name", i );
      objectList.push_back( *tmp );
      new QListViewItem( ListView, tmp->Name );
    }
    

    So jetzt sollte ich 10 Einträge in der ListView haben, die alle 'gleicher Name' heißen. Wenn ich nach dem String 'gleicher Name' in der Liste suche wird, logischer Weise, immer das 1. Objekt ausgespuckt.
    Ich könnte in die struct noch ein Pointer auf ein QListView einfügen usw., ich wollte aber eigentlich die Basisklassen Qt-frei halten.
    Btw. der Bsp-Code ist jetzt nicht auf Fehler geprüft, ging nur darum das Problem klar zu machen.
    Thx fürs lesen ^^

    MfG Bongolus



  • Schau mal in die Dolumentation von Qt.
    Wenn ein Element in QListView angeklickt wird, erhältst du eine Nachricht
    mit dem Index des angeklickten Eintrags.
    Damit kannst du dann weiterarbeiten und dein Fenster aufmachen, usw.



  • War klar das das kommt 😉
    Das kommt bei meinen Bsp. Code auch nicht gut rüber. Die ListView sortiert die Einträge (und das soll sie auch) also ist z.B. der 3. Eintrag in der ListView nicht gleich dem 3. Objekt in der List. Am besten ist wohl wenn ich in dem ListViewItem einen Pointer auf das entsprechende Objekt speichern könnte, aber da hab ich nix gefunden.
    Ist ja sonst auch viel zu einfach 🙄
    Trozdem danke für die Antwort.



  • Statt QListViewItems zu erzeugen, schreib Dir eine davon abgeleitete Klasse, die die zusätzichen Informationen aufnimmt.
    Also in Deinem Beispiel:

    class MyListViewItem : public QListViewItem
    {
    public: 
       MyListViewItem(  QListView * parent, QString label1, myObject* x);
    
       const myObject* getMyObject() const;
    private:
      myObject* _x;
    };
    

    Im Slot QListViewItem::clicked bekommst Du einen Zeiger auf ein QListViewItem, das castest Du in ein MyListViewItem und dann hast Du Dein Objekt.



  • da habe ich mich mit dem "index" wohl missverständlich ausgedrückt.
    Du erhältst, korrekt gesprochen, einen pointer auf das Listviewitem zurück.
    Und nicht die Angabe, das wievielte Element es in dem QListview ist.



  • Moin,
    naja den Zeiger auf das ListViewItem hätte ich ja nur Indexen können. Sobald ich Zeit habe werde ich niemands Vorschlag ausprobieren. Obwohl ich irgentwo gelesen hatte das up-cast Probleme machen sollten, nur kA in welchem Zusammenhang das war. Deswegen hatte ich das eigentlich nie in Erwägung gezogen. Wenns funktioniert gut, wenn nicht dann melde ich mich nochmal. 🙂
    Danke für die Antworten.

    MfG Bongolus.


Anmelden zum Antworten