Seite 1 von 1

QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 13:07
von Icke
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>


Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 15:07
von __blackjack__
@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?

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 15:31
von Icke
@__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.

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 17:13
von __blackjack__
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‽

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 17:48
von Icke
__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.

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 19:25
von __blackjack__
@Icke: Das beantwortet die Frage nicht. Oder warum denkst Du musst Du das so umständlich machen anstatt einfach auf das Attribut zuzugreifen?

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 19:54
von Icke
@__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:

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 22:21
von __blackjack__
@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``.

Re: QMenu find QAction

Verfasst: Mittwoch 23. November 2022, 22:34
von Icke
@__blackjack__: ohje, so einfach. Danke :!: