PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : QT/KDE verknüpfte Listboxen oder TreeView??



celindir
23-01-2003, 11:37
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.


+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!!!

anda_skoa
23-01-2003, 12:36
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,
_

celindir
23-01-2003, 13:20
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

anda_skoa
23-01-2003, 14:24
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:



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:



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,
_

celindir
24-01-2003, 01:50
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


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

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

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



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

anda_skoa
24-01-2003, 08:27
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



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


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,
_

celindir
24-01-2003, 11:42
Hi anda_skoa,

es ist zum verzweifeln. Irgendwas mache ich noch immer Falsch.

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

anda_skoa
24-01-2003, 12:36
Es hat schon funktioniert, aber der Parent ist nicht offen, also sieht man das Childitem nicht.

du könntest das machen



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


ListView1->setRootIsDecorated(true);


Ciao,
_

celindir
24-01-2003, 12:54
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
27-01-2003, 14:00
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


ListView1->setSorting(-1);

eingestellt, wie empfohlen.

Hat noch jemand einen Tipp??

Danach will ich auch bestimmt einige Sachen selber rausbekommen;)

Vielen Dank

Woolf
27-01-2003, 14:37
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 ;)

anda_skoa
27-01-2003, 15:36
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,
_

celindir
07-03-2003, 10:11
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


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

anda_skoa
07-03-2003, 10:57
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,
_

celindir
07-03-2003, 11:11
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 ??


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

oder so rum??



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


Gruß

anda_skoa
07-03-2003, 11:25
Original geschrieben von celindir
Hallo anda_soka,

worauf bezieht sich der Hinweis?

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

ja, den hier:
http://doc.trolltech.com/3.1/qlistviewitem.html#QListViewItem-7



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


den 3., wenn du ein leeres Item einfügen willst



wäre dann der korreke code ??


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

oder so rum??



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


davon der zweite

Ciao,
_