Widgets, die sich gegenseitig ausschließen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
vorlautboy
User
Beiträge: 38
Registriert: Sonntag 7. Dezember 2008, 18:43

hallo,

ich habe in einem mainwindow mehrere widgets (menu/toolbar actions) die abhängig von anderen widgets entweder enabled oder disabled sein sollen. z.b. open/close: actionClose soll erst dann enabled sein, wenn überhaupt eine datei geöffnet wurde.
oder play/pause/stop: logischerweise kann pause/stop nur nach start gedrückt werden, wobei start dann deaktiviert werden muss, und nach stop darf nur noch play enabled sein, und ...
bisher mache ich das alles mit signals und slots, aber allein an einem klick auf play hängt schon so ein langer rattenschwanz dran:

Code: Alles auswählen

from functools import partial as bind
...
self.connect(self.ui.actionStart, QtCore.SIGNAL('triggered()'),\
                     bind(self.ui.actionPause.setEnabled, True))
self.connect(self.ui.actionStart, QtCore.SIGNAL('triggered()'),\
                     bind(self.ui.actionStop.setEnabled, True))
self.connect(self.ui.actionStart, QtCore.SIGNAL('triggered()'),\
                     bind(self.ui.actionStart.setEnabled, False))        
...
gibt es vielleicht schon qt-klassen, die einem die arbeit abnehmen, oder wie macht man das sonst in der praxis?

Danke für eure Antworten
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wie wäre denn dieser Ansatz:

Code: Alles auswählen

def switch_buttons(self, button_pressed):
    switches = {
        'start' : (
            (self.ui.actionPause.setEnabled, True), 
            (self.ui.actionStop.setEnabled, True),
            (self.ui.actionStart.setEnabled, False)
        ),
        'stop' : (
            (self.ui.actionPause.setEnabled, False), 
            (self.ui.actionStop.setEnabled, False),
            (self.ui.actionStart.setEnabled, True)
        ),
        'pause' : (
            (self.ui.actionPause.setEnabled, False), 
            (self.ui.actionStop.setEnabled, True),
            (self.ui.actionStart.setEnabled, True)
        )
    }
    for action in switches[button_pressed]:
        set_enabled, boolean = action
        self.connect(
            self.ui.actionStart,
            QtCore.SIGNAL('triggered()'),
            bind(set_enabled, boolean)
        )
Antworten