Menü Eintrag setEnabled setzen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
FrankM
User
Beiträge: 6
Registriert: Dienstag 20. Juli 2021, 08:51

Dienstag 20. Juli 2021, 09:19

Hallo zusammen,

kurz mal vorstellen. Ich bin 56 Jahre und schreibe schon was länger an einem Restic UI für mich selber herum. Das funktioniert so weit auch alles ganz gut, bis auf zwei Kleinigkeiten, wo ich als Anfänger irgendwie Verständnisprobleme habe und leider auch im Netz nichts finde. Wobei ich davon überzeugt bin, das es da was gibt, ich nur falsch suche...

Ich hatte am Anfang versucht mit dem GUI Designer anzufangen, das geht aber nicht wenn man es nicht versteht. So mit habe ich mein UI von Hand geschrieben und hoffentlich die Zusammenhänge besser verstanden. Heute möchte ich mal nach Hilfe fragen, für eines meiner beiden Probleme.

Was möchte ich machen?
Ich möchte einen Menüpunkt in Abhängigkeit einer Funktion aktivieren lassen, bzw. umgekehrt.
Dazu habe ich in der Dokumentation den Befehl setEnabled(True) gefunden.

Mein Problem!
Es funktioniert nicht, weil ich es nicht verstehe

Beispielcode
Ich habe ein Beispiel aus dem Netz genommen und um ein Menü erweitert um Euch zu zeigen was ich machen möchte.

.

Code: Alles auswählen

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QVBoxLayout, QWidget, QAction, QPushButton
from PyQt5.QtGui import(QIcon)
 
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.button_is_checked = True
        self.menu_is_checked = True
        self.menu_is_checked2 = True # Macht das Menü sichtbar

        self.setWindowTitle("My App")

        button = QPushButton("Press Me!")
        button.setCheckable(True)
        button.clicked.connect(self.the_button_was_toggled)
        button.setChecked(self.button_is_checked)
        
        #----Main Menu ----#
        mainMenu = self.menuBar()
        helpMenu = mainMenu.addMenu('&Help')
        #----Help Menu ----#
        aboutButton = QAction(QIcon('icons/info-circle.svg'), 'About Restic UI', self)
        aboutButton.setCheckable(True)
        aboutButton.setEnabled(True)
        aboutButton.triggered.connect(self.menu_was_toggeld2)
        aboutButton.setEnabled(self.menu_is_checked2)
        helpMenu.addAction(aboutButton)

        self.setCentralWidget(button)
        
    def the_button_was_toggled(self, checked):
        self.button_is_checked = checked
        print(self.button_is_checked)
   
    def menu_was_toggeld2(self, checked):
        print("erreicht", checked)
        self.menu_is_checked2 = False  
  
app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec() 
Über einen Wink mit dem Zaunpfahl würde ich mich freuen :wink:
__deets__
User
Beiträge: 10055
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 20. Juli 2021, 09:54

Das Missverständnis scheint zu sein, dass du denkst, deine Zustandsvariablen (button_is_checked, menu_is_checked2) würden die Innereien von Qt Objekten beeinflussen. Tun sie nicht. Es gibt GUI Frameworks bei denen sowas geht, aber nicht Qt. Du musst in deinen Signalhandlern die Methoden setEnabled, oder wie sie heißt, von QAction direkt aufrufen. Wozu du dir natürlich auch eine Referenz auf die QAction Instanz merken musst, also ein self davor gehört.
FrankM
User
Beiträge: 6
Registriert: Dienstag 20. Juli 2021, 08:51

Dienstag 20. Juli 2021, 15:04

Danke, deine Antwort hat mich in die richtige Richtung gelenkt.

Code: Alles auswählen

from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QVBoxLayout, QWidget, QAction, QPushButton
from PyQt5.QtGui import(QIcon)
 
import sys

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.button_is_checked = True
        self.menu_is_checked = True
        self.menu_is_checked2 = True # Macht das Menü sichtbar

        self.setWindowTitle("My App")

        button = QPushButton("Press Me!")
        button.setCheckable(True)
        button.clicked.connect(self.the_button_was_toggled)
        button.setChecked(self.button_is_checked)
        
        #----Main Menu ----#
        mainMenu = self.menuBar()
        helpMenu = mainMenu.addMenu('&Help')
        #----Help Menu ----#
        self.aboutButton = QAction(QIcon('icons/info-circle.svg'), 'About Restic UI', self)
        self.aboutButton.setCheckable(True)
        self.aboutButton.setEnabled(True)
        self.aboutButton.triggered.connect(self.menu_was_toggeld2)
        self.aboutButton.setEnabled(self.menu_is_checked2)
        helpMenu.addAction(self.aboutButton)
        
        #self.mainMenu(self.aboutButton)

        self.setCentralWidget(button)
        
    def the_button_was_toggled(self, checked):
        self.button_is_checked = checked
        print(self.button_is_checked)
        self.aboutButton.setEnabled(True)
   
    def menu_was_toggeld2(self, checked):
        print("erreicht", checked)
        self.aboutButton.setEnabled(False)
        self.menu_is_checked2 = False  

app = QApplication(sys.argv)

window = MainWindow()
window.show()

app.exec()        
Antworten