Home > PyQt5, python > PyQt5: QGroupBox

PyQt5: QGroupBox

21 Marzo 2019

Torna all’indice degli appunti

QCheckBox

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!

Torna all’indice degli appunti

Categorie:PyQt5, python Tag: ,
I commenti sono chiusi.