PyQt5: Layout
Torna all’indice degli appunti
Layout
Tutti i QWidgets vanno inseriti in un layout.
Il Layout permette di organizzare i widgets (bottoni, label ecc) in modo ordinato
all’interno di un Frame (anche esso un QWidget).
Il layout può essere di tipo QBoxLayout e QGridLayout.
La differenza sta che nel primo tipo, possiamo organizzare i Widget, o solo in una riga (Box orizzontale),
o solo in una colonna (Box verticale).
Per esigenze diverse entra in gioco il QGridLayout per l’appunto.
Come anticipato nell’articolo sul QMainWindow, è necessario fornire la main-window di un
QWidget centrale. Sarà questo widget quindi ad accogliere il layout che organizzerà i widgets.
Vediamo ad esempio come aggiungere due pulsanti in verticale in un QBoxLayout:
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtWidgets import QBoxLayout, QPushButton import sys class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowTitle("QLayout 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) layout = QBoxLayout(QBoxLayout.TopToBottom) self.setLayout(layout) button1 = QPushButton("Button 1") button2 = QPushButton("Button 2") layout.addWidget(button1, stretch=0) layout.addWidget(button2, stretch=0) button1.clicked.connect(self.on_button1_click) button2.clicked.connect(self.on_button2_click) def on_button1_click(self): print("INFO: Button 1 clicked!") def on_button2_click(self): print("INFO: Button 2 clicked!") if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
L’aggiunta avviene tramite il metodo addWidget che prende come parametri, il
widget da aggiungere in fondo al layout (sempre in ultima posizione) e il tipo di stretch.
Il fattore di stretch viene applicato in direzione Layout e si riferisce sempre al widget successivo.
Se tutti i widget haoo stretch=0 lo spazio viene distribuito in accordo con il QWidget sizePolicy().
Per cambiare l’orientamento basta modificare il tipo di layout, passando da orientamento
TopToBottom a LeftToRight:
layout = QBoxLayout(QBoxLayout.LeftToRight)
Se avessimo invece necessità di utilizzare un griglia, esempio di 2 righe e 2 colonne:
from PyQt5.QtWidgets import QMainWindow from PyQt5.QtWidgets import QWidget, QApplication from PyQt5.QtWidgets import QGridLayout, QPushButton import sys class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.setWindowTitle("QLayout 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) layout = QGridLayout() self.setLayout(layout) button1 = QPushButton("Button 1") button2 = QPushButton("Button 2") button3 = QPushButton("Button 3") button4 = QPushButton("Button 4") layout.addWidget(button1, 0, 0) # widget, row, column layout.addWidget(button2, 1, 0) layout.addWidget(button3, 0, 1) layout.addWidget(button4, 1, 1) if __name__ == '__main__': app = QApplication(sys.argv) main_window = MainWindow() main_window.show() sys.exit(app.exec_())
Il widget da aggiungere ad un layout, può ovviamente essere un altro layout.
Commenti recenti