Styliser les widgets
Débloquez votre potentiel ! ✨
Cette session fait partie de notre programme Premium exclusif
Prêt à passer au niveau supérieur ?
Découvrez tous les avantages Premium et transformez votre apprentissage dès aujourd'hui!
Inscris-toi
(c'est gratuit !)
Un compte est nécessaire pour participer aux discussions.
Créer un compteStyliser les widgets
Dans cette partie on va voir comment nous pouvons modifier les widgets de l'application pour avoir un rendu un peu plus intéressant que le rendu actuel.
La première chose que nous allons faire c'est réduire les marges et l'espacement de notre QGridLayout.
Par défaut, un espace est en effet présent entre les widgets et autour du layout.
Pour réduire cet espace, on peut utiliser les méthodes setSpacing et setContentsMargins :
self.main_layout.setSpacing(0)
self.main_layout.setContentsMargins(10, 10, 10, 10)
Attaquons nous maintenant au QLineEdit.
Tout d'abord, on indique une hauteur minimum avec la méthode setMinimumHeight :
self.le_result.setMinimumHeight(50)
Ensuite, nous souhaitons aligner le texte à droite du QLineEdit. Pour ça, on peut utiliser les options d'alignement avec la méthode setAlignment et la constante du module QtCore.Qt.AlignRight du module QtCore :
self.le_result.setAlignment(QtCore.Qt.AlignRight)
Pour finir, nous allons modifier les boutons pour qu'ils aient une taille minimale et qu'ils puissent s'étendre en largeur et en hauteur quand on change la taille de la fenêtre.
On utilise tout d'abord la méthode setMinimumSize pour indiquer une taille minimum de 48 par 48 pixels :
button.setMinimumSize(48, 48)
Et pour finir on utilise le sizePolicy et la méthode
setSizePolicy pour modifier le comportement des boutons en cas de modification de la taille de la fenêtre :button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
!!!note
N'oubliez pas d'importer la classe QSizePolicy du module PySide6.QtWidgets au préalable :
from PySide6.QtWidgets import QSizePolicy
!!!
Avec QSizePolicy.Expanding on indique que l'on souhaite permettre aux boutons de prendre toute la largeur et la hauteur disponible à l'intérieur des cellules du QGridLayout.
Voici le code final de cette partie :
from PySide6 import QtCore
from PySide6.QtGui import QShortcut, QKeySequence
from PySide6.QtWidgets import QApplication, QWidget, QGridLayout, QLineEdit, QPushButton, QSizePolicy
BUTTONS = {"C": (1, 0, 1, 1),
"/": (1, 3, 1, 1),
"7": (2, 0, 1, 1),
"8": (2, 1, 1, 1),
"9": (2, 2, 1, 1),
"x": (2, 3, 1, 1),
"4": (3, 0, 1, 1),
"5": (3, 1, 1, 1),
"6": (3, 2, 1, 1),
"-": (3, 3, 1, 1),
"1": (4, 0, 1, 1),
"2": (4, 1, 1, 1),
"3": (4, 2, 1, 1),
"+": (4, 3, 1, 1),
"0": (5, 0, 1, 2),
".": (5, 2, 1, 1),
"=": (5, 3, 1, 1)}
OPERATIONS = ["+", "-", "/", "x"]
class Calculator(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Calculatrice")
self.buttons = {}
self.main_layout = QGridLayout(self)
# On réduit l'espacement et les marges
self.main_layout.setSpacing(0)
self.main_layout.setContentsMargins(0, 0, 0, 0)
self.le_result = QLineEdit("0")
self.le_result.setMinimumHeight(50)
self.le_result.setAlignment(QtCore.Qt.AlignRight)
self.le_result.setEnabled(False)
self.main_layout.addWidget(self.le_result, 0, 0, 1, 4)
for button_text, button_position in BUTTONS.items():
button = QPushButton(button_text)
# On définit une taille minimum
button.setMinimumSize(48, 48)
# On permet aux boutons de prendre toute la largeur et la hauteur possible
button.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
if button_text not in ["=", "C"]:
button.clicked.connect(self.number_or_operation_pressed)
self.main_layout.addWidget(button, *button_position)
self.buttons[button_text] = button
self.buttons["C"].clicked.connect(self.clear_result)
self.buttons["="].clicked.connect(self.compute_result)
self.connect_keyboard_shortcuts()
@property
def result(self):
return self.le_result.text()
def number_or_operation_pressed(self):
# On empêche d'utiliser plusieurs fois de suite un symbole d'opération
if self.result[-1] in OPERATIONS and self.sender().text() in OPERATIONS:
return
# On empêche de commencer par un symbole d'opération
if self.result == "0" and self.sender().text() in OPERATIONS:
return
if self.result == "0":
self.le_result.clear()
self.le_result.setText(self.result + self.sender().text())
def clear_result(self):
self.le_result.setText("0")
def compute_result(self):
try:
result = eval(self.result.replace("x", "*"))
except SyntaxError:
return
self.le_result.setText(str(result))
def remove_last_character(self):
if len(self.result) > 1:
self.le_result.setText(self.result[:-1])
else:
self.le_result.setText("0")
def connect_keyboard_shortcuts(self):
for button_text, button in self.buttons.items():
QShortcut(QKeySequence(button_text), self, button.clicked.emit)
QShortcut(QKeySequence(QtCore.Qt.Key_Return), self, self.compute_result)
QShortcut(QKeySequence(QtCore.Qt.Key_Backspace), self, self.remove_last_character)
app = QApplication()
win = Calculator()
win.show()
app.exec()
Ce n'est pas fini...
Tu as complété % du parcours 🔥
Termine l'intégralité de la formation pour pouvoir débloquer ton attestation de réussite.