Ein oder mehrere Funktionen ausführen basierend auf Checkbox

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Hallo,

ich habe ein Menu mit mehreren Checkboxes.

Code: Alles auswählen

        countrymenu = menubar.addMenu('&Country')
        m_italy = QtGui.QAction('Italy', menubar, checkable=True)
        m_spain = QtGui.QAction('Spain', menubar, checkable=True)
        countrymenu.addAction(m_italy)
        countrymenu.addAction(m_spain)

Und einen Button:

Code: Alles auswählen

     

            self.btn_download = QtGui.QPushButton()
            self.btn_download.setObjectName(_fromUtf8("btn_download"))
            self.layout.addWidget(self.btn_download)
            self.btn_download.clicked.connect(self.downloadFile)
So weit so einfach.

Nun möchte ich das, je nachdem welche Checkboxes markiert sind, entweder 2 unterschiedliche oder beide Funktionen ausgelöst werden. Wie kann man soetwas machen?
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

QAction besitzt die Funktion IsChecked(), welche dir true/false zurück gibt. Damit kannst du in dem Ereignis, welches durch den Button ausgelöst wird, prüfen, welche QAction aktiviert ist und entsprechend reagierst du dann im Code.

Pseudo-Code

Code: Alles auswählen

is_italy = m_italy.IsChecked()
is_spain = m_spain.IsChecked()
is_both = is_italy and is_spain

if (is_both):
   do_that()
elif (is_italy and not is_spain):
   do_something_different
elif (is_spain and not is_italy):
   do_something_more_different
else
   do_something_completely_different()
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Hallo Madmartigan,

danke für deine Antwort. Wusste nicht, dass man eine Variable vom Type Boolean "addieren" kann. Das wird mir sicher noch viel helfen.


Aber leider habe ich noch ein Verständnisproblem beim Programm aufbau.

Viele Tutorial zeigen entweder, wie ich ein Programm aufbaue mit QWidget oder mit QMainWindow. Aber nirgends sehe ich beides. Mein Problem ist nämlich, dass ich nicht weiß, wie ich auf ein Object zugreife, welches sich in einer anderen Klasse befinden.

Siehe:

Code: Alles auswählen

class Window(QtGui.QMainWindow):
    
    def __init__(self):
        super(Window, self).__init__()

        self.initUi()

    def initUi(self):

        self.statusBar().showMessage('Ready')

        exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(QtGui.qApp.quit)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('&File')
        fileMenu.addAction(exitAction)


        update_italy = QtGui.QAction('Italy', menubar, checkable=True)
        update_spain = QtGui.QAction('Spain', menubar, checkable=True)
        update_hungary = QtGui.QAction('Hungary', menubar, checkable=True)

        updatemenu = menubar.addMenu('&Update')
       
        updatemenu.addAction(update_italy)
        updatemenu.addAction(update_spain)
        updatemenu.addAction(update_hungary)

        self.setObjectName(_fromUtf8("Window"))
        self.resize(550, 947)
        self.setFixedSize(550, 947)

        self.form_widget = FormWidget(self) 
        self.setCentralWidget(self.form_widget) 

        self.show()


class FormWidget(QtGui.QWidget):

    def __init__(self, parent):        
            super(FormWidget, self).__init__(parent)
            self.layout = QtGui.QVBoxLayout(self)

            self.setLayout(self.layout)

            #[MEINE GUI ELEMENTE]
            .
            .
            .



        
    def checkselection(self):
        
        is_italy = [b]Window.initUi.update_italy.IsChecked()[/b]
        is_spain = self.update_spain.IsChecked()
        is_both = update_italy and update_spain
         
        if (is_both):
           pass
        elif (is_italy):
           print "Italy"
        elif (is_spain and not is_italy):
           print "spain"
        else:
           pass

Die fett markierte Zeile funktioniert leider nicht, weil ich nicht weiß, wie an das Menu herankomme. Oder hätte ich mein Programm gleich anders aufbauen müssen?
BlackJack

@BjoernLaemmerzahl: Die Objekte befinden sich nicht in einer anderen Klasse sondern sind an lokale Namen in einer Methode auf einem anderen Objekt. Da kommt man von aussen gar nicht heran (ohne schwarze Magie und damit auch nur solange der andere Methodenaufruf gerade läuft, denn danach sind die Namen nicht mehr existent).

Du musst diese Werte also an ein Objekt binden und das dem `FormWidget` als Argument übergeben und dort auch an das Objekt binden, damit andere Methoden darauf zugreifen können.

Eventuell gehört das auch gar nicht in den GUI-Code sondern in die Geschäftslogik von dem Programm. Dann könnte man bei den `QAction`\s das `triggered()`-Signal mit einem Slot verbinden der den Checked-Status an das Objekt weitergibt welches die Geschäftslogik implementiert und dieses Objekt beiden GUI-Objekten bekannt machen.
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Danke, das wusste ich nicht.

Ich glaube nicht, dass mein Code der "Geschäftslogik" entspricht, allerdings weiß ich leider nicht wie ich den Code umschreiben muss. Ich werde mich mal schlaumachen.

Eine Möglichkeit wäre natürlich alle Elemente aus "class Window(QtGui.QMainWindow)" direkt in das Widget zu übernehmen.

Falls jemand eine bessere Idee hat....
BjoernLaemmerzahl
User
Beiträge: 22
Registriert: Sonntag 17. Mai 2015, 12:22

Gelöst :)
Antworten