Seite 1 von 1
Ein oder mehrere Funktionen ausführen basierend auf Checkbox
Verfasst: Mittwoch 29. Juli 2015, 18:26
von BjoernLaemmerzahl
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?
Re: Ein oder mehrere Funktionen ausführen basierend auf Chec
Verfasst: Donnerstag 30. Juli 2015, 00:49
von Madmartigan
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()
Re: Ein oder mehrere Funktionen ausführen basierend auf Chec
Verfasst: Mittwoch 5. August 2015, 15:16
von BjoernLaemmerzahl
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?
Re: Ein oder mehrere Funktionen ausführen basierend auf Chec
Verfasst: Mittwoch 5. August 2015, 15:34
von 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.
Re: Ein oder mehrere Funktionen ausführen basierend auf Chec
Verfasst: Mittwoch 5. August 2015, 18:36
von BjoernLaemmerzahl
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....
Re: Ein oder mehrere Funktionen ausführen basierend auf Chec
Verfasst: Sonntag 9. August 2015, 14:44
von BjoernLaemmerzahl
Gelöst
