Composants graphiques usuels avec Qt 5

Après avoir abordé la gestion d’un composant graphique simple dans la page Premier bouton en Python avec Qt 5, nous allons considérer ici quelques autres composants graphiques usuels : la case à cocher, l”étiquette et le champ de texte.

Nous travaillons ici avec PyQt5, voir Introduction aux interfaces graphiques en Python avec Qt 5 et PyQt5.

Case à cocher - QCheckBox

Une case à cocher permet d’effectuer un choix (coché/non coché) pour une case. Elle est instanciée grâce à la classe QCheckBox.

Présentation

class QCheckBox(text)

Case à cocher dont le constructeur reçoit un libellé qui sera affiché à côté de la case pour en préciser le rôle.

Paramètres:text (string) – libellé qui sera affiché à côté de la case
checkState()

Renvoie la valeur de l’état de la case

Renvoie:Qt.Checked ou Qt.Unchecked
setCheckState(state)

Fixe la valeur de l’état de la case.

Paramètres:state – état à prendre : Qt.Checked ou Qt.Unchecked

Exemple

import sys
from PyQt5.QtWidgets import QApplication, QCheckBox

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

# création de la case à cocher
case = QCheckBox("Voici ma premiere case a cocher")

# la case à cocher est rendue visible
case.show()

app.exec_()

Gestion d’une case à cocher

On peut gérer une case à cocher de 2 façons :

  • en gérant une action sur la case
  • en cherchant à connaître son état (coché/non coché)

Gestion de l’action sur une case à cocher

Chaque action de l’utilisateur sur une case à cocher déclenche un événement de changement d’état. Comme pour un bouton, sauf que cet événement est déclenché chaque fois que l” on coche ou décoche la case.

On va connecter le signal stateChanged de la classe QCheckBox avec l’appel d’une fonction.

Exemple

import sys
from PyQt5.QtWidgets import QApplication, QCheckBox

# on définit une fonction à connecter au signal envoyé
def etat_change():
    print("action sur la case")
    
app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

# création de la case à cocher
case = QCheckBox("Voici ma premiere case a cocher")

# on connecte le signal "stateChanged" à la fonction "etat_change"
case.stateChanged.connect(etat_change)

# la case à cocher est rendue visible
case.show()

app.exec_()

Etat d’une case à cocher

On peut connaître l”état d’une case à cocher en utilisant la méthode checkState() de la classe QCheckBox. On peut aussi changer l’état de la case en utilisant la méthode setCheckState().

Exemple

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QCheckBox

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)
  
        # création de la case à cocher
        self.case = QCheckBox("Voici ma premiere case a cocher")

        # on connecte le signal "stateChanged" à la méthode "etat_change"
        self.case.stateChanged.connect(self.etat_change)
        
        # création du gestionnaire de mise en forme
        layout = QVBoxLayout()
        # ajout de la case à cocher au gestionnaire de mise en forme
        layout.addWidget(self.case)
        # on fixe le gestionnaire de mise en forme de la fenêtre
        self.setLayout(layout)
 
        self.setWindowTitle("Ma fenetre")

    # on définit une méthode à connecter au signal envoyé
    def etat_change(self):
        print("action sur la case")
        if self.case.checkState() == Qt.Checked:
            print("coche")
        else:
            print("decoche") 

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
    
fen = Fenetre()
fen.show()

app.exec_()

Autre exemple

Il également possible de connaître l’état de la case au travers de l’argument transmis à la fonction qui est appelée.

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QCheckBox

def etat_change(etat):
    print("action sur la case")
    if etat == Qt.Checked:
        print("coche")
    else:
        print("decoche") 
    
app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

case = QCheckBox("Voici ma premiere case a  cocher")
case.stateChanged.connect(etat_change)
case.show()

app.exec_()

Etiquette - QLabel

Une étiquette (en anglais label) est un composant de type QLabel qui permet d’afficher un texte non éditable par l’utilisateur, mais que le programme peut faire évoluer.

Le constructeur de QLabel précise le texte initial.

Présentation

class QLabel(text)

Etiquette dont le constructeur précise le texte initial.

Paramètres:text (string) – texte initial qui sera affiché
setText(text)

Modifie le texte de l’étiquette.

Paramètres:text – texte à afficher

Exemple

import sys
from PyQt5.QtWidgets import QApplication, QLabel

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

# création de l'étiquette
label = QLabel("Voici mon premier texte avec un QLabel")

# l'étiquette est rendue visible
label.show()

app.exec_()

Exemple avec modification du texte

Le programme peut modifier à tout instant le texte d’un QLabel à l’aide de la méthode setText().

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLabel

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        self.n = 0 # attribut pour compter le nombre d'appui sur le bouton
  
        # création du bouton
        self.bouton = QPushButton("mon bouton avec une gestion d'appui")
        # on connecte le signal "clicked" à la méthode "appui_bouton"       
        self.bouton.clicked.connect(self.appui_bouton)
 
        # création de l'étiquette
        self.label = QLabel("appui n = " + str(self.n))
        
        # mise en place du gestionnaire de mise en forme
        layout = QVBoxLayout()
        layout.addWidget(self.bouton)
        layout.addWidget(self.label)
        self.setLayout(layout)
        
        self.setWindowTitle("Ma fenetre")

    # on définit une méthode à connecter au signal envoyé
    def appui_bouton(self):
        # on incrémente l'attribut "n" de 1
        self.n = self.n + 1 
        # on utilise la méthode "setText" de QLabel pour fixer le texte
        self.label.setText("appui n = " + str(self.n))

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
    
fen = Fenetre()
fen.show()

app.exec_()

Champ de texte - QLineEdit

Un champ de texte (aussi appelé champ de saisie de texte) est une zone de texte éditable dans laquelle l’utilisateur peut entrer ou modifier un texte. Il s’obtient en instanciant un objet de type QLineEdit.

Présentation

class QLineEdit(texte)

Champ de texte avec un texte initial facultatif.

Paramètres:texte (string) – texte initial qui sera affiché
text()

Renvoie de le texte contenu dans le champ de texte.

Renvoie:texte contenu dans le champ de texte
Type renvoyé:string

Exemple

import sys
from PyQt5.QtWidgets import QApplication, QLineEdit

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)

# création du champ de texte
champ = QLineEdit("Voici mon premier champ de texte")

# le champ de texte est rendu visible
champ.show()

app.exec_()

Exploitation usuelle d’un champ de texte

On peut connaître à tout moment le texte contenu dans un champ de texte à l’aide de la méthode text().

Voici un exemple où on ajoute dans la fenêtre un bouton destiné à copier le contenu du champ de texte. Le prélèvement du texte se fera lors de l’action sur ce bouton.

Exemple :

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, \
                            QVBoxLayout, QLabel, QLineEdit

class Fenetre(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        # création du champ de texte
        self.champ = QLineEdit()
        
        # création du bouton
        self.bouton = QPushButton("COPIE")
        # on connecte le signal "clicked" à la méthode "appui_bouton_copie"
        self.bouton.clicked.connect(self.appui_bouton_copie)
 
        # création de l'étiquette
        self.label = QLabel()
        
        # mise en place du gestionnaire de mise en forme
        layout = QVBoxLayout()
        layout.addWidget(self.champ)
        layout.addWidget(self.bouton)
        layout.addWidget(self.label)
        self.setLayout(layout)
        
        self.setWindowTitle("Ma fenetre")

    # on définit une méthode à connecter au signal envoyé
    def appui_bouton_copie(self):
        # la méthode "text" de QLineEdit permet d'obtenir le texte à copier
        texte_a_copier = self.champ.text()
        # la méthode "setText" de QLabel permet de changer
        # le texte de l'étiquette
        self.label.setText(texte_a_copier)

app = QApplication.instance() 
if not app:
    app = QApplication(sys.argv)
    
fen = Fenetre()
fen.show()

app.exec_()