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 :
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 :
!!!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 :
fromPySide6importQtCorefromPySide6.QtGuiimportQShortcut,QKeySequencefromPySide6.QtWidgetsimportQApplication,QWidget,QGridLayout,QLineEdit,QPushButton,QSizePolicyBUTTONS={"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"]classCalculator(QWidget):def__init__(self):super().__init__()self.setWindowTitle("Calculatrice")self.buttons={}self.main_layout=QGridLayout(self)# On réduit l'espacement et les margesself.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)forbutton_text,button_positioninBUTTONS.items():button=QPushButton(button_text)# On définit une taille minimumbutton.setMinimumSize(48,48)# On permet aux boutons de prendre toute la largeur et la hauteur possiblebutton.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)ifbutton_textnotin["=","C"]:button.clicked.connect(self.number_or_operation_pressed)self.main_layout.addWidget(button,*button_position)self.buttons[button_text]=buttonself.buttons["C"].clicked.connect(self.clear_result)self.buttons["="].clicked.connect(self.compute_result)self.connect_keyboard_shortcuts()@propertydefresult(self):returnself.le_result.text()defnumber_or_operation_pressed(self):# On empêche d'utiliser plusieurs fois de suite un symbole d'opérationifself.result[-1]inOPERATIONSandself.sender().text()inOPERATIONS:return# On empêche de commencer par un symbole d'opérationifself.result=="0"andself.sender().text()inOPERATIONS:returnifself.result=="0":self.le_result.clear()self.le_result.setText(self.result+self.sender().text())defclear_result(self):self.le_result.setText("0")defcompute_result(self):try:result=eval(self.result.replace("x","*"))exceptSyntaxError:returnself.le_result.setText(str(result))defremove_last_character(self):iflen(self.result)>1:self.le_result.setText(self.result[:-1])else:self.le_result.setText("0")defconnect_keyboard_shortcuts(self):forbutton_text,buttoninself.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()