Das heimtückische Untermenu

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo,

das Untermenu beschäftigt mich gerade ein Wenig. Im Grunde ist es kein weltbewegendes Problem. Was ich möchte? Ich hätte gerne ein Icon in einem Untermenu. Als Beispiel denkt an das berühmte "Senden an" im Menu. Geht man mit der Maus auf den Menupunkt "Senden an" so bekommt man in einem weiteren Untermenu Optionen geboten, dass man an sein Desktop senden kann, an seinen Brenner, an einen ZIP-Ordner und vieles mehr. Dies sieht dann wie folgt aus:

Bild

Und wie ihr seht, sind bei "Ordner", "Kontakte" etc Icons zu sehen. Und so hätte ich es auch gerne. Ich war ja auch so clever, habe es im Qt-Designer angefertigt, die *.ui-Datei in eine *.py-Datei umgewandelt um in den generierten Code einzusehen. Der Code sieht dann wie folgt aus:

*.ui-Datei

Code: Alles auswählen

[...]
        self.actionCSV_datei = QtGui.QAction(MainWindow)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(_fromUtf8("../Xarphus/Images/16x16/Support.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.actionCSV_datei.setIcon(icon)
        self.actionCSV_datei.setObjectName(_fromUtf8("actionCSV_datei"))
        self.actionTest = QtGui.QAction(MainWindow)
[...]
Die bisherigen Icons, die ich in meinen Menupunkt unterbringen konnten sehen so aus:
MDIForm_Menue.py

Code: Alles auswählen

[...]
        self.MNUL_Info = self.addMenu("&?")

        self.DoShowmnuHilfe = QAction(QIcon("Xarphus/Images/16x16/help.png"),"Hilfe", self)
        self.DoShowmnuHilfe.setStatusTip("Hilfe des Programms")
        self.MNUL_Info.addAction(self.DoShowmnuHilfe)
[...]
Bis hier hatte ich auch keinerlei Probleme.

Nun hier meinen Untermenu-Punkt:
MDIForm_Menue.py

Code: Alles auswählen

[...]
        self.MNUL_Verwaltung = self.addMenu('&Verwaltung')

        # Menüpunk
        self.DoShowmnuFilm = self.MNUL_Verwaltung.addMenu("Filme")
        # Untermenü
        #self.FilmAdd = QAction(QIcon(path.join('Xarphus\Images\16x16\world1.png')), 'NewFilm', self)
        self.FilmAdd = self.DoShowmnuFilm.addAction("Film hinzufügen")
        self.FilmAdd.setStatusTip("Einen neuen Film hinzufügen")
        self.FilmAdd.setShortcut("Ctrl+F")
[...]
Wie wir in Zeile 7 sehen können, hatte ich meinen Versuch gestartet, aber leider funktionierte es nicht. Dazu kam auch keine Fehlermeldung. Könnte mir jemand bitte ein wenig Hilfestellung geben, wie ich in einem Untermenu-Punkt ein Icon hinzugefügt bekomme?

Ich danke euch
Sophus
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Wo funktioniert es nicht, unter Windows, unter Linux, unter beiden? Du verwendest im Übrigen immer noch os.path.split ohne es verstanden zu haben. Die Trennzeichen von Verzeichnissen sind eben unter Windows und Linux verschieden, guck mal in die Doku ( https://docs.python.org/2/library/os.path.html) oder orientiere dich an einem Tutorial, z.B. hier: http://pymotw.com/2/ospath/
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

EmaNymton hat geschrieben:Wo funktioniert es nicht, unter Windows, unter Linux, unter beiden? Du verwendest im Übrigen immer noch os.path.split ohne es verstanden zu haben. Die Trennzeichen von Verzeichnissen sind eben unter Windows und Linux verschieden, guck mal in die Doku ( https://docs.python.org/2/library/os.path.html) oder orientiere dich an einem Tutorial, z.B. hier: http://pymotw.com/2/ospath/
Hallo,

die Geschichte mit "os.path.split" war mein Fehler. Ich verwende es momentan noch nicht. Dass es in meinem Beispiel zu sehen war lag einzig und allein daran, weil ich vergessen habe, sie wieder rauszunehmen. Bezüglich der Trennzeichen von Verzeichnissen ist kein Problem. Das merke ich besonders daran, dass sie bei meinen ToolBar und bei meinen "normalen" Menupunkten sehr gut funktionieren. Denn die Icons sind sowohl unter Linux als auch unter Windows bei beiden Objekten wunderbar zu sehen. Aber wenn wir schon beim Thema sind: Du sagtest, zwischen Linux und Windows existieren zwei unterschiedliche Trennzeichen von Verzeichnissen, dann frage ich mich, ob es keine Möglichkeit gibt, sie so zu vereinen, dass sie ebenso plattformunabhängig funktionieren?

Aber kommen wir zum eigentlichen Problem. Die Icons im Untermenu funktionieren bei beiden nicht. Ehrlich gesagt wüsste ich nicht wie und wo ich ansetzen soll. Bei "normalen" Menupunken - eben ohne Untermenu - klappt es wunderbar. Beispiel wäre das "Beenden" als Menupunkt.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Sophus hat geschrieben:Du sagtest, zwischen Linux und Windows existieren zwei unterschiedliche Trennzeichen von Verzeichnissen, dann frage ich mich, ob es keine Möglichkeit gibt, sie so zu vereinen, dass sie ebenso plattformunabhängig funktionieren?
Ja, gibt es, nämlich os.path.join ;) (hab mich oben verschrieben, meinte natürlich join statt split)
Sophus hat geschrieben: Aber kommen wir zum eigentlichen Problem. Die Icons im Untermenu funktionieren bei beiden nicht. Ehrlich gesagt wüsste ich nicht wie und wo ich ansetzen soll. Bei "normalen" Menupunken - eben ohne Untermenu - klappt es wunderbar. Beispiel wäre das "Beenden" als Menupunkt.
Wenn du dich an die richtige Verwendung von addMenu und addAction hälst und die Pfade richtig sind, sehe ich da kein Problem, bei mir klappt das ohne Probleme:
Bild

Ich würde also nochmal prüfen, ob deine Pfade im Quelltext richtig sind/generiert werden und du die Befehle richtig verwendest.

P.S.: Weiß nicht, ob das schon mal jemand erwähnt hat, aber dein Quelltext hält sich sehr wenig an die üblichen Konventionen (http://legacy.python.org/dev/peps/pep-0008/) und ist somit schwer lesbar. Mal ein paar Punkte, die mir aufgefallen sind:
  • Bezeichner für Instanzen einer Klasse werden klein geschrieben und ohne CamelCase, sondern mit Unterstrichen.
  • eine Zeile sollte nicht länger als 80 Zeichen sein
  • Namen sollten aussagekräftig sein, d.h. vermeide Abkürzungen, wenn es nicht gerade sehr gebräuchliche sind, z.B. was soll MNUL_Verwaltung aussagen? menu_leiste_verwaltung oder kürzer menu_verwaltung versteht man auch noch, wenn man nach Monaten nochmal in den Quelltext sieht. Auch DoShowmnuBuch impliziert nicht, dass es sich dabei um einen Menupunkt handelt, sondern eher, dass etwas getan wird ("do show"). Auch mischst du hier englisch und deutsch, was man generell vermeiden sollte und sich auf eine Sprache festlegt.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

EmaNymton hat geschrieben:
Sophus hat geschrieben:Du sagtest, zwischen Linux und Windows existieren zwei unterschiedliche Trennzeichen von Verzeichnissen, dann frage ich mich, ob es keine Möglichkeit gibt, sie so zu vereinen, dass sie ebenso plattformunabhängig funktionieren?
Ja, gibt es, nämlich os.path.join ;) (hab mich oben verschrieben, meinte natürlich join statt split)
Wie man die os.path.join - Geschichte richtig verwendet, muss ich mir wohl nochmal genauer anschauen.
EmaNymton hat geschrieben:
Sophus hat geschrieben: Aber kommen wir zum eigentlichen Problem. Die Icons im Untermenu funktionieren bei beiden nicht. Ehrlich gesagt wüsste ich nicht wie und wo ich ansetzen soll. Bei "normalen" Menupunken - eben ohne Untermenu - klappt es wunderbar. Beispiel wäre das "Beenden" als Menupunkt.
Wenn du dich an die richtige Verwendung von addMenu und addAction hälst und die Pfade richtig sind, sehe ich da kein Problem, bei mir klappt das ohne Probleme:
Bild

Ich würde also nochmal prüfen, ob deine Pfade im Quelltext richtig sind/generiert werden und du die Befehle richtig verwendest.
Jetzt staune ich schlecht :-) Kannst du mir da mal ein paar hilfreiche Tipps geben? Wie ich schon sagte, komme ich über die einfache Benutzung nicht hinweg. Hier nochmal mein Beispiel: Aber durch den Befehl(?) QAction wird ja zunächst ein Menupunkt "Support" angelegt, und ein Icon zugewiesen. Und in Zeile 4 wird dann der Menuleiste "MNUL_Info" das Attribute "DoShowmnuSupport" übergeben. Aber weiter komme ich gerade nicht.

Code: Alles auswählen

[...]
        self.DoShowmnuSupport = QAction(QIcon("Xarphus/Images/16x16/support.png"),"Support", self)
        self.DoShowmnuSupport.setStatusTip("Support des Programms")
        self.MNUL_Info.addAction(self.DoShowmnuSupport)
[...]
EmaNymton hat geschrieben: P.S.: Weiß nicht, ob das schon mal jemand erwähnt hat, aber dein Quelltext hält sich sehr wenig an die üblichen Konventionen (http://legacy.python.org/dev/peps/pep-0008/) und ist somit schwer lesbar. Mal ein paar Punkte, die mir aufgefallen sind:
  • Bezeichner für Instanzen einer Klasse werden klein geschrieben und ohne CamelCase, sondern mit Unterstrichen.
  • eine Zeile sollte nicht länger als 80 Zeichen sein
  • Namen sollten aussagekräftig sein, d.h. vermeide Abkürzungen, wenn es nicht gerade sehr gebräuchliche sind, z.B. was soll MNUL_Verwaltung aussagen? menu_leiste_verwaltung oder kürzer menu_verwaltung versteht man auch noch, wenn man nach Monaten nochmal in den Quelltext sieht. Auch DoShowmnuBuch impliziert nicht, dass es sich dabei um einen Menupunkt handelt, sondern eher, dass etwas getan wird ("do show"). Auch mischst du hier englisch und deutsch, was man generell vermeiden sollte und sich auf eine Sprache festlegt.
Danke für den Ratschlag. Ich werde mich in Zukunft darum bemühen.
Antworten