Widgets, die sich gegenseitig ausschließen

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

Widgets, die sich gegenseitig ausschließen

Beitragvon vorlautboy » Donnerstag 26. Februar 2009, 11:17

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: 5384
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Freitag 27. Februar 2009, 02:36

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)
        )
shcol (Repo | Doc | PyPi)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder