QMenuBar und QMenu

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

Hallo, ich habe zwei Fragen zu der QMenuBar, die ich durch meine Recherche und der Dokumentation nicht lösen konnte.

Zum einen hätte ich gerne ein QMenu, welches besonders hervorgehoben ist. Sprich dass entweder die Schrift anders formatiert ist oder der Eintrag ganz rechts in der Menüleiste erscheint, was am besten wäre. Ist sowas möglich? Sollte dies nicht möglich sein, wäre als letzte Möglichkeit auch ein Seperator denkbar, den ich aber leider durch den Designer nicht hinzufügen konnte.

Notfalls müsste ich mir vielleicht auch überlegen das Menü in eine Toolbar zu machen, wie hier beschrieben: http://www.python-forum.de/viewtopic.ph ... ilit=qmenu

Des weiteren habe ich einen Menü-Eintag, der kein Unterverzeichnis(Action) hat.
Durch

Code: Alles auswählen

self.connect(self.menuExam_Mode, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
wollte ich diesen Menü-Eintrag direkt mit einem Slot verbinden. Anders als mit Untermenüs klappt das aber nicht? Warum? Wie macht man es richtig bei den QMenu's?

Liebe Grüße
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Trubinial Guru hat geschrieben: Des weiteren habe ich einen Menü-Eintag, der kein Unterverzeichnis(Action) hat.
Kapiere ich nicht! Beschreibe mal besser, was Du hast! Ggf. auch durch einen Screenshot oder ein MocUp!

Das ist doch nicht Dein erstes Post zu Qt... da hat Dich doch schon sicherlich jemand auf die "New style Signal and Slots" hingewiesen?

Code: Alles auswählen

# alt
self.connect(self.menuExam_Mode, QtCore.SIGNAL('triggered()'), QtCore.SLOT('close()'))
# neu
self.menuExam_Mode.triggered.connect(close)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
deets

Mal eine Gegenfrage: welche Motivation hast du, etablierte UI-Paradigmen zu zerbrechen? Unter OsX zb wäre dein Ansatz unmöglich - da gibt's genau eine Art, wie das Menu dargestellt wird.

Für mich hört sich das an, als ob du toolbar & Menü Funktionalität versuchen willst. Warum?
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

@deets: Du hast wohl recht, auch unter den neueren Ubuntu Versionen wäre das unmöglich. Auch die Toolbar&Menü Version ist eigentlich nicht gerade das schönste.
Mir fällt es gerade schwer einen geeigneten Platz für eine "Umschaltmöglichkeit" zu finden. Die Menüleiste schien da am besten geeignet, aber ich muss mir wohl etwas anderes überlegen.

Mit der Entscheidung nicht die Menüleiste zu nutzen wurde eigentlich die zweite Frage wegfallen, jedoch würde es mich trotzdem interessieren und vielleicht hilft es ja noch jemand anderem. Einen Screenshot kann man davon wohl nicht machen, aber ich werde es einfach sehr Bildhaft beschreiben.
Wenn man mit der Maus über die Einträge in der Menüleiste fährt erscheinen die verschiedenen Untereinträge des Menüpunktes. Z.B. wenn man über Datei fährt sieht man die Einträge Speichern, Speichern unter oder auch Exportieren als. Wie ich diese Untereinträge mit einem Slot verbinde ist mir klar, aber wie kann ich den Eintrag Datei der Menüleiste mit einem Slot verbinden, ohne dass ich Untereinträge habe? :arrow:
deets

Ich sehe nicht, dass QMenu das dazu notwendige Signal generiert. Und wie gesagt - so funktionieren Menues nunmal nicht.

Ich vermute mal durch Ableitung von QMenu koenntest du das implementieren. Aber da musst du schon selbst ran.
lunar

@Trubinial Guru: "QMenuBar" ist in dieser Hinsicht nicht anders als "QMenu". Die hinzugefügten Einträge sind "QAction"-Objekte, die einerseits selbst ein "triggered"-Signal besitzen, andererseits auch "QMenuBar.triggered()" bei der Aktivierung auslösen.
deets

@lunar

Ich glaube er will schon ein Signal beim hovern/higlight eines Menues. Die gibt's aber laut Doku nur fuer die Actions darin, nicht schon den Menue-namen.
lunar

@deets: Jedes Untermenü, dass einer Menüleiste oder einem Menü hinzugefügt wird, ist ein "QAction"-Objekt. Mit QMenu.menuAction() kommt man an das zu einem Menü gehörende "QAction"-Objekt.
deets

@lunar

Und wie kann das gehen, wenn QMenu nicht von QAction erbt?

[edit]genauer lesen beantwortet diese frage, alles klar[/edit]
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

@ deets: Ich will nur das Signal beim wirklichen drücken auf das QMenu.

@lunar: Wenn man mit menuAction() an das QAction Objekt kommt, müsste folgendes doch eigentlich funktionieren, oder?

Code: Alles auswählen

        self.feedback = self.menuFeedback.menuAction()
        self.feedback.triggered.connect(self.feedback_web)
Leider passiert aber nichts...
lunar

@Trubinial Guru: Unter OS X passiert bei mir auch nichts. Möglicherweise sind solche Ereignisse nicht Teil der Schnittstelle der nativen Menüleiste, so dass Qt nicht darauf zugreifen kann. Gleiches gilt für die Menüleiste unter Unity, auf welche die Anwendung gar keinen direkten Zugriff hat. Je nachdem, was Du vorhast, kannst Du Dir mit "QMenu.aboutToShow()" behelfen. Dieses Signal wird ausgelöst, wenn das Untermenü angezeigt werden soll, also unmittelbar nach dem Klick auf den betreffenden Eintrag in der Menüleiste.

Ich erlaube mir an dieser Stelle allerdings die nachdrückliche Frage nach Deinem Usecase. Warum musst Du auf den Klick auf einen Menüeintrag mit Untermenü reagieren?! Diese Aktion hat in jeder bedeuteten GUI-Umgebung genau eine semantische Bedeutung, nämlich das entsprechende Untermenü aufzuklappen. Du programmierst gegen das Rahmenwerk, nicht mit ihm, und brichst mit dem Resultat Deiner Bemühungen wahrscheinlich jede diesbezügliche UI-Richtlinie. Wenn Du überhaupt zum Ziel kommst, da mindestens OS X und Unity der Anwendung die Kontrolle über die Menüleiste fast vollständig entziehen. Unter OS X kann man nicht mal normale Einträge (also solche ohne Untermenü) in die Menüleiste einfügen.
Trubinial Guru
User
Beiträge: 117
Registriert: Dienstag 7. April 2009, 13:40

@ lunar: Vielen Dank für deine durchaus informative Erklärung! Für mich kommt das dann einfach nicht in frage, gerade durch das Verhalten unter Unity und OS X.

Ich hatte mich wohl auch ein wenig kompliziert ausgedrückt. Ich wollte nicht unbedingt auf den klick auf einen Menüeintrag mit Unterverzeichnis reagieren, sondern allgemein einen Menüeintrag in der Menüleiste. Mittlerweile wurde mir klar, dass der Designer immer nur Menüeinträge mit Unterverzeichnis erstellt... Nichtsdestotrotz kommt für mich das nicht mehr in Frage, da das Programm Plattform übergreifend ist.

Ich danke euch!
Antworten