PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim Erstellen von Popupmenüs



Kirsche
20-05-2005, 13:06
Hallo Leute,

ich habe ein Problem beim Erstellen von Popupmenüs, bei denen man Häkchen setzen kann. Ich habe herausgefunden, wie man die Häkchen per Quellcode setzt (toolbarMenu->setItemChecked ( 3, true );), aber im compilierten Programm kann ich keine Häkchen (um-)setzen.

Hier ist der Code-Abschnitt:

QPopupMenu *toolbarMenu = new QPopupMenu( this );
toolbarMenu->setCheckable( true );

toolbarMenu->insertItem( "Toolbar File", this, SLOT(slotViewToolbarFile(int)), 0, 0);
toolbarMenu->insertItem( "Toolbar Edit", this, SLOT(slotViewToolbarEdit(int)), 0, 1);
toolbarMenu->insertItem( "Toolbar Export", this, SLOT(slotViewToolbarExport(int)), 0, 2);
toolbarMenu->insertItem( "Toolbar Run", this, SLOT(slotViewToolbarRun(int)), 0, 3);

toolbarMenu->setItemChecked ( 3, true );

Man soll damit einstellen können, welche Toolbars man haben möchte und welche nicht. Theoretisch bräuchte ich also einen Slot, der die id erhält und dann entsprechend reagiert ( show und hide?). Ich weiß nur nicht, wie das Signal heißt und wie ich es verbinde. :confused:

Vielen Dank

anda_skoa
20-05-2005, 14:12
Am besten statt manuel gesetzer Items QAction verwenden, in diesem Fall mit setToggleAction(true)

Dann kannst du direkt dieses Action Objekt beinflussen, daß macht dann seine Repräsentation im Menü selber

Ciao,
_

Kirsche
20-05-2005, 15:51
Hallo anda_skoa,

vielen Dank für den Tipp. Ich habe es ausprobiert, und es klappt. Ich habe inzwischen auch herausgefunden, wie man es noch machen kann:
toolbarMenu->insertItem( "Toolbar File", this, SLOT(slotViewToolbarFile()), 0, 0);

Deine Lösung ist allerdings eleganter, weil man die Häkchen nicht selber setzen muss. Nun habe ich allerdings ein neues Problem:

Mit den Häkchen markiere ich, welche Toolbars angezeigt werden sollen. Das Einblenden mache ich mit show, das Ausblenden mit hide. Ist das richtig so, oder gibt es eine bessere Lösung? Mein Problem ist, dass es bei QMainWindow ein eingebautes Menü gibt. Wenn man einen Rechtsklick auf eine Toolbar macht, werden alle Toolbars angezeigt, die es gibt. Dort kann man auch Häkchen setzen. Wenn ich eine Toolbar abgestellt habe, ist sie dort auch deaktiviert. Umgekehrt gibt es keine Synchronisation. Wenn ich im Menü eine Toolbar deaktiviere, ist immer noch ein Häkchen in meinem eigenen Menü. Wie komme ich an die Signale heran, die beim Menü ausgelöst werden, das man mit dem Rechtsklick erhält? Ich bräuchte ja nur die Signale so verknüpfen, dass in meinem Menü die Häkchen synchron gesetzt werden.

Vielen Dank

anda_skoa
20-05-2005, 15:57
Deine Lösung ist allerdings eleganter, weil man die Häkchen nicht selber setzen muss. Nun habe ich allerdings ein neues Problem:

Und auch universeller, weil man eine Action zu beliebig vielem Menüs hinzufügen kann und auch zu Toolbars.



Mit den Häkchen markiere ich, welche Toolbars angezeigt werden sollen. Das Einblenden mache ich mit show, das Ausblenden mit hide. Ist das richtig so, oder gibt es eine bessere Lösung?

Das ist schon richtig so.



Wie komme ich an die Signale heran, die beim Menü ausgelöst werden, das man mit dem Rechtsklick erhält?


QToolBar ist von QDockWindow abgeleitet und das hat ein Signa visibilityChanged(bool)

Wahrscheinlich kannst du dieses Signal direkt mit dem setChecked Slot der Action verbinden.

Ciao,
_

Kirsche
20-05-2005, 18:52
Hallo anda_skoa,

noch mal vielen Dank für deine Hilfe. Es klappt jetzt mit der Synchronisation. Darauf wäre ich nicht alleine gekommen. Das qt-Manual ist zwar sehr gut, aber Qt ist auch sehr komplex. Da findet man nicht immer, was man sucht bzw. man weiß gar nicht, wonach man eigentlich suchen soll.

Ich habe nun schon wieder eine Frage: Ich möchte ein QDockWindow erstellen, dass eine Liste vom Typ QListView enthält. Den Anfang habe ich geschafft, doch nun bin ich nicht sicher, wie man eine typische Struktur erhält, also "+" und "-", wenn man Unterordner öffnet. Oder geöffnete und geschlossene Ordner etc. Gibt es unter Qt schon eingebaute Funktionen dafür, oder muss man alles selber programmieren? Z.B. wenn man einen Eintrag öffnet, dass man unterschiedliche Bilder lädt (geöffneten, geschlossenen Ordner).

Vielen Dank,

anda_skoa
21-05-2005, 11:18
Ansich erhält man so eine Struktur ziemlich einfach, d.h. man erzeugt einfach QListViewItems mit einem anderen Item als Parent, dann entsteht automatisch ein Baum.

Es gibt bei den Qt Examples ein Beispiel, wie man immer erst beim Öffnen eines Astes dessen Inhalte erzeugt, wenn das Erzeugen des ganzen Baumes zu lange dauern würde weil man dann rekursiv alles Verzeichnisse durcharbeiten müßte.

Allerdings besteht in deinem Fall evenuell sogar die Möglichkeit, statt einer eigenen Lösung einfach einen QFileDialog einzubetten.

Dazu muß man eine QFileDialog Instanz erzeugen und sie anschließend mit reparent() dem einbettenden Fenster als Kind zuweisen.

Ciao,
_

Kirsche
21-05-2005, 12:43
Hallo anda_skoa, :)

vielen Dank noch mal. Ich glaube, QFileDialog ist nicht das, was ich brauche. Ich habe eben noch mal etwas weiter gesucht und folgendes gefunden:
datatreeList->setRootIsDecorated ( true );
Damit erhält man + und -. Außerdem ist mir eingefallen, dass ich immer die gleichen Symbole brauche, egal, ob etwas offen oder geschlossen ist. Die Bilder kann ich direkt bei QListView Item setzen. Ich denke, wenn ich die Bilder doch ändern wollte, müsste ich das nach dem clicked-Signal machen.

Schöne Grüße,

anda_skoa
21-05-2005, 13:09
vielen Dank noch mal. Ich glaube, QFileDialog ist nicht das, was ich brauche.

War mehr eine spontane Idee :)
(der Auswahlwizard im Designer am Anfang benutzt das)


Ich denke, wenn ich die Bilder doch ändern wollte, müsste ich das nach dem clicked-Signal machen.


besser collapsed und expanded

Ciao,
_