Seite 1 von 1

Widgets, die sich gegenseitig ausschließen

Verfasst: Donnerstag 26. Februar 2009, 11:17
von vorlautboy
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

Verfasst: Freitag 27. Februar 2009, 02:36
von snafu
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)
        )