Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: QT/KDE verknüpfte Listboxen oder TreeView??

  1. #1
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87

    Question QT/KDE verknüpfte Listboxen oder TreeView??

    Hallo zusammen,

    eins vorweg: Ich habe bisher noch keine Erfahrungen mit QT oder KDE-Programmierung. Deshalb bitte Antworten DAU-verständlich formulieren

    Ich habe folgendes vor:
    (Ich hoffe, ich kann das so beschreiben, dass auch noch ein anderer ausser mir weiss, was gemeint ist )

    In einer Applikation soll es zwei Listboxen geben
    dabei soll die rechte Listbox Items enthalten, die genau einem Item aus der linken Listbox zugeordnet sind.

    Wird links ein anderes Item gewählt, sollen rechts die zu diesem Item gehörenden Items angezeigt und verändert werden können.

    Konkret:

    Linke Listbox (lb_movies) enthält eine Liste von mpg-fimen, die der User aus der Liste hinzufügen oder entfernen kann

    wenn ich mpg1 auswähle sollen rechts (lb_chapters) Sprungmarken (Zeitangaben)für den mpg1 eingetragen werden können.

    Wie speichere ich nun aber am besten die Sprungmarken für mpg1, damit ich sie nicht verliere, wenn ich in lb_movies auf listItem mpg2 wechsele? Denn dann werden ja in lb_chapters die Einträge für mpg2 angezeigt.

    Geht das in einem (mehrdimensionalen) Array?
    Wie muss ich das konkret anstellen?

    Wer eine Idee hat, wier mann soetwas macht, der ist herzlich aufgefordert, mir zu helfen.

    Ich bin auch offen für eine ganz andere Idee!

    Z.B. eine Art TreeView , wo ich Einträge und Untereinträge erstellen und löschen kann.
    Code:
     
    +mpg1 
       + chapter1
       + chapter 2
    +mpg2
       + chapter1
       + chapter2
       + chapter3

    Das wäre natürlich noch besser, aber da habe ich im Moment keine Ahnung, wie man das mit QT/KDE macht.

    Also jede Hilfe ist willkommen!!!
    Celindir
    May the source be with you...

    www.celindir.de

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Hmm, das ist beides nicht schwer

    Vielleicht sagst du mir zuerst, welche der beiden Varianten (zwei Listen, oder der TreeView) du bevorzugst, dann sehen wir mit den Details weiter.

    Der TreeView ist in Qt der QListView, falls du es im Qt Designer anschaune möchtest.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Hi anda_skoa,

    das hört sich vielversprechend an.

    Zuerst hatte ich ja an die Variante mit den beiden Listboxen gedacht, weil ich die zumindest einzeln schon mal verstanden hatte

    Aber wenn ich ehrlich bin, ist der TreeView die bessere Variante für meinen Zweck. Daher wäre es toll, wenn Du mir dabei helfen könntest.

    Ich habe mir auich schon mal die Beschreibeung von class KListView ausgedruckt, habe aber erst eine sehr verschwommene Vorstellung davon, wie ich sie nutzen kann.


    Vielen Dank
    Celindir
    May the source be with you...

    www.celindir.de

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Die Benutzung von KListView bzw QListView (die Basisklasse von KListView) ist relativ einfach.

    Alle Einträge in einem KListView sind QListViewItems oder davon abgeleitete Klassen.

    Wenn du dir die Konstruktoren davon ansiehst, dann hat jede QListViewItem Klasse mindestens zwei:

    Code:
    QListViewItem ( QListView * parent )
    QListViewItem ( QListViewItem * parent )
    Es gibt dann Variantionen davon, die mehrere Parameter enthalten, aber es geht darum, dass ein QListViewItem entweder den ListView oder ein anderes Item als Parent hat.

    Wenn der ListView der Parent ist, dann ist es ein Item der obersten Ebene, sonst ein untergeorgnetes Element eines anderen Item.

    Um dein Beispiel zu visualiseren würden man das etwa so machen:

    Code:
    KListView* listView = new KListView();
    
    QListViewItem* item = new QListViewItem(listView, "mpg1");
    QListViewItem* subItem = new QListViewItem(item, "chapter1");
    subItem = new QListViewItem(item, "chapter2");
    
    item = new QListViewItem(listView, "mpg2");
    subItem = new QListViewItem(item, "chapter1");
    subItem = new QListViewItem(item, "chapter2");
    subItem = new QListViewItem(item, "chapter3");
    Im Normalfall hat man das Aufbauen des Itembaumes in einer eigene Methode, der man entweder die Datenstrukut der Inhalte übergibt, oder die die Inhalte in der Klasse selbst findet.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Hi anda_skoa,

    vielen Dank für Deine Informationen, sie haben mir schon mal viel weitergeholfen.

    So wie es aussieht, war Dein Beispiel, für ein TreeView, der vorher fest steht.

    Ich brauche aber einen, der erst durch die Interaktion mit dem User entsteht.

    Ich habe auch schon meine ersten Erfolge erzielt:
    ich habe ein Listview
    Code:
        lv_movie_list = new QListView( tab_4, "lv_movie_list" );
        lv_movie_list->addColumn( tr2i18n( "Sequence-Items" ) );
        lv_movie_list->header()->setClickEnabled( FALSE, lv_movie_list->header()->count() - 1 );
        lv_movie_list->header()->setResizeEnabled( FALSE, lv_movie_list->header()->count() - 1 );
        lv_movie_list->setGeometry( QRect( 18, 36, 411, 601 ) );
    und mit
    Code:
    pb_add_sequ_items_clicked()
    {
      
      QString home;
      QString openFile;
      home = le_input_dir->text();
      if (home.isEmpty()) home = QDir::homeDirPath();
      openFile = QFileDialog::getOpenFileName(home,"MPEG-Movies (*.mpg *.mpeg)",this,"Choose MPEG Movies");
    
       if (!openFile.isEmpty())
      lv_movie_list->insertItem(new QListViewItem(lv_movie_list, trUtf8 ( openFile )));
    }
    kann ich Items oberster Ebene erstellen und mit
    Code:
     pb_remove_sequ_items_clicked()
    {
    if (!lv_movie_list->selectedItem()==0)
      lv_movie_list->takeItem(lv_movie_list->selectedItem());
    
    }
    kann ich sie auch wieder entfernen.

    Nun bleibt aber noch das Problem, wenn ich ein Item markiert habe und dann
    ein Subitem hinzufügen will, dann mache ich irgendwas falsch


    Code:
    pb_add_chapters_clicked()
    {
    if (!lv_movie_list->selectedItem()==0)
    lv_movie_list->selectedItem()->insertItem(new QListViewItem(lv_movie_list->selectedItem(), le_add_chapter->text()));
    }
    es passiert aber gar nichts!

    Hast Du da eine Idee??

    Ausserdem werden die Einträge automatisch alphabetisch sortiert, was ich für meinen Zweck gar nicht gebnrauchen kann. Wie kann man die Sortierung ausschalten??

    Wäre klasse, wenn Du mir noch mal auf die Sprünge helfen könntest
    Celindir
    May the source be with you...

    www.celindir.de

  6. #6
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von celindir

    Nun bleibt aber noch das Problem, wenn ich ein Item markiert habe und dann
    ein Subitem hinzufügen will, dann mache ich irgendwas falsch


    Code:
    pb_add_chapters_clicked()
    {
    if (!lv_movie_list->selectedItem()==0)
    lv_movie_list->selectedItem()->insertItem(new QListViewItem(lv_movie_list->selectedItem(), le_add_chapter->text()));
    }
    es passiert aber gar nichts!

    Hast Du da eine Idee??
    das sollte reichen
    Code:
    new QListViewItem(lv_movie_list->selectedItem(), le_add_chapter->text());
    Da du einen Parent angibst, brauchst du kein insertItem zu machen.
    Das passiert intern automatisch.


    Ausserdem werden die Einträge automatisch alphabetisch sortiert, was ich für meinen Zweck gar nicht gebnrauchen kann. Wie kann man die Sortierung ausschalten??
    mit setSorting, wobei column -1 sein muss.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  7. #7
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Hi anda_skoa,

    es ist zum verzweifeln. Irgendwas mache ich noch immer Falsch.
    Code:
    void Treeview::pb_parent_add_clicked()
    {
    //funktioniert
      dummy=LineEdit1->text();
      if (!dummy.isEmpty())
      ListView1->insertItem(new QListViewItem(ListView1, dummy));
    }
    
    
    void Treeview::pb_remove_parent_clicked()
    {
    //funktioniert
      if (!ListView1->selectedItem()==0)
      ListView1->takeItem(ListView1->selectedItem());
    }
    
    void Treeview::pb_child_add_clicked()
    {
    //funktioniert nicht (es passiert garnix)
      dummy=LineEdit1->text();
      if (!ListView1->selectedItem()==0)
      new QListViewItem( ListView1->selectedItem(), dummy  );
    }
    Ich habe extra ein kleines Dummy-Programm angelegt, um die Funktion isoliert zu testen aber auch da komme ich nicht weiter :( 0

    Falls Du Lust hast, wäre es super nett, wenn Du Dir das ganze Ding mal ansehen könntest (Keine Ahnung, ob Du so viel Zeit hast) aber Du findest den Fehler bestimmt schneller.
    treeview-0.1.tar.gz

    Vielen Dank


    edit: Download entfernt
    Geändert von celindir (02-04-2003 um 10:45 Uhr)
    Celindir
    May the source be with you...

    www.celindir.de

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Es hat schon funktioniert, aber der Parent ist nicht offen, also sieht man das Childitem nicht.

    du könntest das machen

    Code:
    if (!ListView1->selectedItem()==0)
    {
        new QListViewItem( ListView1->selectedItem(), dummy  );
        ListView1->selectedItem()->setOpen(true);
    }
    Wenn du bei den Elementen der obersten Ebene auch ein [+] haben möchtest, dann
    Code:
    ListView1->setRootIsDecorated(true);
    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87

    Thumbs up

    Vielen Dank anda_skoa !!!!!

    Wie immer stecken die Tücken im Detail

    Waren die Einträge schon immer da und haben sich einfach nicht gezeigt.
    Unverschämtheit von den kleinen Biestern

    Super, jetzt kann ich mein erstes eigenes KDE-Programm wohl doch irgendwann realisieren.

    Gruß
    Celindir
    May the source be with you...

    www.celindir.de

  10. #10
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Hi,

    ich bin nach wie vor begeistert.
    Die automatische Sortierung habe ich auch abstellen können, aber einen kleinen Hinweis bräuchte ich noch:


    Im Moment werden neue Eintrage immer oben eingefügt, so dass die Reihenfolge oben letztes Item und unten erstes Item ist.

    Ich bräuchte es aber gerade umgekehrt (erstes Item oben; letztes Item unten)

    Im Moment ist

    Code:
    ListView1->setSorting(-1);
    eingestellt, wie empfohlen.

    Hat noch jemand einen Tipp??

    Danach will ich auch bestimmt einige Sachen selber rausbekommen

    Vielen Dank
    Celindir
    May the source be with you...

    www.celindir.de

  11. #11
    Registrierter Benutzer
    Registriert seit
    21.10.2002
    Beiträge
    53
    ich kenn mich mit qt nicht aus aber wenn die immer oben erscheinen könntest du die einträge in einen array speichern und dann einfach umgekehrt einfügen
    Slackware 8.1
    C/C++ OpenGL lover
    Java2 learner

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von celindir
    Im Moment werden neue Eintrage immer oben eingefügt, so dass die Reihenfolge oben letztes Item und unten erstes Item ist.

    Ich bräuchte es aber gerade umgekehrt (erstes Item oben; letztes Item unten)
    Probiers mal ohne das ListView1->insertItem
    Nur das new QListViewItem

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  13. #13
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Hallo zusammen,

    nachdem ich jetzt eine Weile mit QListView und QListViewItem gekämpft habe und mir auch die Dokumentation dazu durchgelesen (verstanden ist eine andere Sache) habe, bleibt noch ein Problem in der Anwendung:

    Wie füge ich einen neuen Eintrag am Ende des Baumes ein?

    Bei mir werden neue Einträge immer oben eingefügt, auch wenn ich

    Code:
    new QListViewItem( ListView1, "NeuerEintrag");
    mache.

    Es müsste doch möglich sein, den neuen Eintrag an einer bestimmten Stelle im Tree unter einen existierenden Eintrag einzusetzen.
    Wenn ich dann als Stelle fürs Einsetzen

    ListView1->lastItem()

    nehme, müsste er doch eigentlich gehen, oder?

    Bleibt also die Frage, wie ich an einer bestimmten Stelle einfüge??

    Vielen Dank fürs Kopfzerbrechen
    Celindir
    May the source be with you...

    www.celindir.de

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    7. QListViewItem Konstruktor.

    zweiter Parameter ist ein QListViewItem
    Hinter diesem wird eingefügt.

    Hinter dem letzten geht das so, wie du geschrieben hast.

    Wenn du den Text einer Spalte kennst, kannst du das Item mit
    QListView::findItem suchen.

    Sonst bleibt dir immer noch Duchiterieren.
    Mit QListView::firstItem beginnen und dann mit QListViewItem::nextSibling() weiter

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    14.11.2002
    Ort
    Obertshausen
    Beiträge
    87
    Original geschrieben von anda_skoa
    7. QListViewItem Konstruktor.
    Hallo anda_soka,

    worauf bezieht sich der Hinweis?

    Meinst Du den 7. beschriebenen Konstruktor in der QT Dokumentation??

    müsste es dann nicht eher der 3. und 4. sein??

    wäre dann der korreke code ??

    Code:
    new QListViewItem( ListView1, "NeuerEintrag", ListView1->lastItem());
    oder so rum??


    Code:
    new QListViewItem( ListView1, ListView1->lastItem(), "NeuerEintrag");

    Gruß
    Celindir
    May the source be with you...

    www.celindir.de

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •