PyQt5: QGroupBox
Torna all’indice degli appunti
Il GroupBox è un contenitore con titolo e bordo, che permette di raggruppare elementi.
Siccome il groupbox può ospitare un widget soltanto, volendo raggruppare più widget (es. dei radio button), è consigliabile utilizzare un BoxLayout. Il GroupBox conterrà quindi il BoxLayout,
che a sua volta conterrà i widget multipli.
Es.:
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QRadioButton from PyQt5.QtWidgets import QGroupBox, QVBoxLayout import sys class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowTitle("QGroupBox Example") self.central_widget = FormWidget(self) self.setCentralWidget(self.central_widget) self.resize(300, 100) class FormWidget(QWidget): def __init__(self, parent): super(FormWidget, self).__init__(parent) groupbox = QGroupBox("Nations") external_box = QBoxLayout(QBoxLayout.TopToBottom) external_box.addWidget(groupbox, 0) internal_box = QVBoxLayout() radiobutton1 = QRadioButton("Italy", self) radiobutton1.setChecked(True) radiobutton2 = QRadioButton("France", self) internal_box.addWidget(radiobutton1, 0) internal_box.addWidget(radiobutton2, 0) groupbox.setLayout(internal_box) self.setLayout(external_box) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
Un metodo interessante è setCheckable(bool) che setta la costante checkable a True o False.
Se settiamo checkable a True, al posto della label del groupbox, apparirà una checkbox, che ci permetterà di abilitare o disabilitare i widget del groupbox stesso:
... groupbox.setCheckable(True) ...
Per sapere se il groupbox è checkable, si utilizza il metodo isCheckable:
>>> from PyQt5.QtWidgets import QApplication, QGroupBox >>> app = QApplication([]) >>> groupbox = QGroupBox("Nations") >>> groupbox.setCheckable(True) >>> groupbox.isCheckable() True
Per settare lo stato di checkable al groupbox, si usa il metodo setChecked(bool).
Settandolo a False, il groupbox sarà disattivato fino a chè non clicchiamo la checkbox del titolo.
Per sapere in quale stato (checked: True/False) si trova il groupbox si usa il metodo isChecked.
>>> groupbox.setChecked(False) >>> groupbox.isChecked() False
Allineamento widget
L’allineamento del widget all’interno del groupbox è modificabile con il metodo setAlignment(alignment), dove alignment può assumere i seguenti valori: Qt.AlignLeft, Qt.AlignRight, Qt.AlignHCenter.
Avendo utilizzato un BoxLayout all’interno del GrouBox, è necessario specificarne l’allineamento:
... from PyQt5.QtCore import Qt ... internal_box = QVBoxLayout() internal_box.setAlignment(Qt.AlignRight) ... groupbox.setLayout(internal_box) groupbox.setCheckable(True) groupbox.setChecked(False) groupbox.setAlignment(Qt.AlignRight) self.setLayout(external_box) ...
Segnali
Esclusi i segnali dei widget compresi nel group box, va evidenziato clicked.
Ogni volta che clicchiamo sulla checkbox del groupbox, viene emesso un segnale clicked, che possiamo connettere ad uno slot dedicato:
... groupbox.clicked.connect(self.on_groupbox) def on_groupbox(self): groupbox = self.sender() title = groupbox.title() if groupbox.isChecked(): print("<%s> group box ENABLED!" % title) else: print("<%s> group box DISABLED!" % title) ...
Utilizzare sender permette di utilizzare un unico slot per il segnale clicked.
GroupBox multipli
E’ infatti possibile utilizzare più groupBox come nel sequente esempio:
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QWidget, QApplication, QBoxLayout, QRadioButton from PyQt5.QtWidgets import QGroupBox, QVBoxLayout import sys class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowTitle("QGroupBox Example") self.central_widget = FormWidget(self) self.setCentralWidget(self.central_widget) self.resize(300, 100) class FormWidget(QWidget): def __init__(self, parent): super(FormWidget, self).__init__(parent) external_box = QBoxLayout(QBoxLayout.TopToBottom) groupbox = QGroupBox("Nations") external_box.addWidget(groupbox, 0) groupbox.setCheckable(True) groupbox.setChecked(False) internal_box = QVBoxLayout() groupbox.setLayout(internal_box) radiobutton1 = QRadioButton("Italy", self) radiobutton1.setChecked(True) radiobutton2 = QRadioButton("France", self) internal_box.addWidget(radiobutton1, 0) internal_box.addWidget(radiobutton2, 0) groupbox2 = QGroupBox("Cities") external_box.addWidget(groupbox2, 0) groupbox2.setCheckable(True) groupbox2.setChecked(False) internal_box2 = QVBoxLayout() groupbox2.setLayout(internal_box2) radiobutton3 = QRadioButton("Bologna", self) radiobutton3.setChecked(True) radiobutton4 = QRadioButton("Milano", self) internal_box2.addWidget(radiobutton3, 0) internal_box2.addWidget(radiobutton4, 0) self.setLayout(external_box) groupbox.clicked.connect(self.on_groupbox) groupbox2.clicked.connect(self.on_groupbox) def on_groupbox(self): groupbox = self.sender() title = groupbox.title() if groupbox.isChecked(): print("<%s> group box ENABLED!" % title) print("Available options:") for radiobox in [w for w in groupbox.children() if isinstance(w, QRadioButton)]: print(radiobox.text()) else: print("<%s> group box DISABLED!" % title) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
Quando le checkbox dei groupbox saranno selezionate, potremo ricavare l’oggetto QGroupBox di riferimento, tramite il metodo sender di QWidget e di conseguenza gli attributi necessari, come ad esempio i radiobutton utilizzati, utilizzando il metodo children
<Nations> group box ENABLED! Available options: Italy France <Nations> group box DISABLED! <Cities> group box ENABLED! Available options: Bologna Milano <Cities> group box DISABLED!
Commenti recenti