Home > PyQt5, python > PyQt5: Layout

PyQt5: Layout

8 Marzo 2019

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.

Torna all’indice degli appunti

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