QMenu find QAction

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Icke
User
Beiträge: 14
Registriert: Mittwoch 23. November 2022, 12:55

Hallo zusammen,

ich habe eine Desktop Application mit dem QtDesigner erstellt und nutze die UI Files. Bisher klappt auch alles soweit. (Achtung: Python und Qt Anfänger)

In der MenuBar möchte ich nun über Python Menueinträge aktivieren/deaktivieren, komme jedoch an das Item nicht ran.
Der Menueintrag "Exit" ist doch eine QAction, oder habe ich das was falsch verstanden?

Beispiel: Im Filemenu das Item Exit deaktivieren.
ItemExit bleibt allerdings immer leer. Kann mir jemand sagen, wie ich an den Eintrag komme?

Code: Alles auswählen

        menubar = self.menuBar()
        menuFile = menubar.findChild(QMenu, "menuFile")
        itemExit = menuFile.findChild(QAction, "actionExit")
Das ist das UI File

Code: Alles auswählen

   <widget class="QMenu" name="menuFile">
    <property name="title">
     <string>Datei</string>
    </property>
    <addaction name="actionExit"/>
   </widget>

Greetings -=Icke=-

I do this just for fun, not professionell
only QtDesigner and Python and absolute beginner
Benutzeravatar
__blackjack__
User
Beiträge: 11265
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Icke: Man kann die `QAction`\s ja mit der `actions()`-Methode von `QMenu`-Objekten abfragen. Bekommst Du das über den Weg? Sind die Actions überhaupt Kinder von dem Menü-Objekt? Man kann Actions ja auch an verschiedenen anderen Stellen einsetzen, ohne das sie einem Menü zugeordnet sein müssen. Wo tauchen die denn in der Baumansicht im Designer auf?
“It should be noted that no ethically-trained software engineer would ever consent to write a `DestroyBaghdad` procedure. Basic professional ethics would instead require him to write a `DestroyCity` procedure, to which `Baghdad` could be given as a parameter.” — Nathaniel Borenstein
Icke
User
Beiträge: 14
Registriert: Mittwoch 23. November 2022, 12:55

@__blackjack__ : Das war schon mal ein guter Tipp. Die Methode "actions" gibt mir eine Listen der Actions zurück. Allerdings finde ich keinen Ansatz eine bestimmte Action zu identifizieren. Es stehen lediglich die Eigenschaften der Action drinnen.

Im Designer sind die unter menubar/menuNAME/item(action) zu finden.
Greetings -=Icke=-

I do this just for fun, not professionell
only QtDesigner and Python and absolute beginner
Benutzeravatar
__blackjack__
User
Beiträge: 11265
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Na das ist ja mal lustig irreführend. Da steht aber nur <addAction> in der XML-Datei. Das <action>-Element das die QAction tatsächlich definiert, also auch die Eigenschaften festlegt, wird an anderer Stelle in der Hierarchie definiert. Was das identifizieren angeht: Jedes QObject hat einen `objectName()`.

Warum benutzt Du überhaupt `findChildren()`? Das wird doch von `uic.loadUi()` schon als Attribut auf dem Objekt gesetzt‽
“It should be noted that no ethically-trained software engineer would ever consent to write a `DestroyBaghdad` procedure. Basic professional ethics would instead require him to write a `DestroyCity` procedure, to which `Baghdad` could be given as a parameter.” — Nathaniel Borenstein
Icke
User
Beiträge: 14
Registriert: Mittwoch 23. November 2022, 12:55

__blackjack__ hat geschrieben: Mittwoch 23. November 2022, 17:13 Warum benutzt Du überhaupt `findChildren()`? Das wird doch von `uic.loadUi()` schon als Attribut auf dem Objekt gesetzt‽
Ich wollte dynamisch einzelne Item deaktivieren/aktivieren.
Greetings -=Icke=-

I do this just for fun, not professionell
only QtDesigner and Python and absolute beginner
Benutzeravatar
__blackjack__
User
Beiträge: 11265
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Icke: Das beantwortet die Frage nicht. Oder warum denkst Du musst Du das so umständlich machen anstatt einfach auf das Attribut zuzugreifen?
“It should be noted that no ethically-trained software engineer would ever consent to write a `DestroyBaghdad` procedure. Basic professional ethics would instead require him to write a `DestroyCity` procedure, to which `Baghdad` could be given as a parameter.” — Nathaniel Borenstein
Icke
User
Beiträge: 14
Registriert: Mittwoch 23. November 2022, 12:55

@__blackjack__: Mir ist unklar, wie ich sonst auf dieses Item kommen sollte. Ich muss doch ein bestimmtes Item (action) finden um dessen Attribute bearbeiten zu können. Klär mich bitte auf :wink:
Greetings -=Icke=-

I do this just for fun, not professionell
only QtDesigner and Python and absolute beginner
Benutzeravatar
__blackjack__
User
Beiträge: 11265
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Icke: Der Name des Objekts aus Qt-Sicht, ist der Name des Attributs in Python. Du benutzt das doch schon für `menuBar`, genau so geht das auch für die anderen Objekte. Einfach ``self.actionExit``.
“It should be noted that no ethically-trained software engineer would ever consent to write a `DestroyBaghdad` procedure. Basic professional ethics would instead require him to write a `DestroyCity` procedure, to which `Baghdad` could be given as a parameter.” — Nathaniel Borenstein
Icke
User
Beiträge: 14
Registriert: Mittwoch 23. November 2022, 12:55

@__blackjack__: ohje, so einfach. Danke :!:
Greetings -=Icke=-

I do this just for fun, not professionell
only QtDesigner and Python and absolute beginner
Antworten