Sur cette page

Exemple de modifications de ligne

L'exemple « Champs de saisie » illustre les nombreuses façons d'utiliser QLineEdit et montre les effets de diverses propriétés et validateurs sur les données saisies et affichées par l'utilisateur.

Application présentant différents types et utilisations des modifications de ligne

L'exemple se compose d'une seule classe « Window », contenant une sélection de champs de saisie avec différentes contraintes de saisie et propriétés d'affichage pouvant être modifiées en sélectionnant des éléments dans des listes déroulantes. La présentation groupée de ces éléments aide les développeurs à choisir les propriétés adaptées aux champs de saisie et facilite la comparaison des effets de chaque validateur sur les données saisies par l'utilisateur.

Définition de la classe Window

La classe Window hérite de QWidget et contient un constructeur ainsi que plusieurs slots :

class Window : public QWidget
{
    Q_OBJECT

public:
    Window(QWidget *parent = nullptr);

public slots:
    void echoChanged(int);
    void validatorChanged(int);
    void alignmentChanged(int);
    void inputMaskChanged(int);
    void accessChanged(int);

private:
    QLineEdit *echoLineEdit;
    QLineEdit *validatorLineEdit;
    QLineEdit *alignmentLineEdit;
    QLineEdit *inputMaskLineEdit;
    QLineEdit *accessLineEdit;
};

Ces slots servent à mettre à jour le type de validateur utilisé pour un champ de saisie donné lorsqu’un nouveau validateur a été sélectionné dans la liste déroulante associée. Les champs de saisie sont stockés dans la fenêtre afin d’être utilisés dans ces slots.

Implémentation de la classe de fenêtre

Le constructeur ` Window ` sert à configurer les champs de saisie, les validateurs et les listes déroulantes, à relier les signaux des listes déroulantes aux slots de la classe ` Window `, et à organiser les widgets enfants dans des mises en page.

Nous commençons par créer une instance de ` group box ` contenant une étiquette, une liste déroulante et un champ de saisie, afin de pouvoir illustrer la propriété ` QLineEdit::echoMode ` :

Window::Window(QWidget *parent)
    : QWidget(parent)
{
    QGroupBox *echoGroup = new QGroupBox(tr("Echo"));

    QLabel *echoLabel = new QLabel(tr("Mode:"));
    QComboBox *echoComboBox = new QComboBox;
    echoComboBox->addItem(tr("Normal"));
    echoComboBox->addItem(tr("Password"));
    echoComboBox->addItem(tr("PasswordEchoOnEdit"));
    echoComboBox->addItem(tr("No Echo"));

    echoLineEdit = new QLineEdit;
    echoLineEdit->setPlaceholderText("Placeholder Text");
    echoLineEdit->setFocus();

À ce stade, aucun de ces widgets n’a encore été disposé dans des mises en page. À terme, les éléments ` echoLabel`, ` echoComboBox` et ` echoLineEdit ` seront placés dans une mise en page verticale à l’intérieur de la zone de groupe ` echoGroup `.

De la même manière, nous créons des zones de groupe et des collections de widgets pour montrer les effets de ` QIntValidator ` et ` QDoubleValidator ` sur le contenu d'un champ de saisie :

    QGroupBox *validatorGroup = new QGroupBox(tr("Validator"));

    QLabel *validatorLabel = new QLabel(tr("Type:"));
    QComboBox *validatorComboBox = new QComboBox;
    validatorComboBox->addItem(tr("No validator"));
    validatorComboBox->addItem(tr("Integer validator"));
    validatorComboBox->addItem(tr("Double validator"));

    validatorLineEdit = new QLineEdit;
    validatorLineEdit->setPlaceholderText("Placeholder Text");

L’alignement du texte est illustré par un autre groupe de widgets :

    QGroupBox *alignmentGroup = new QGroupBox(tr("Alignment"));

    QLabel *alignmentLabel = new QLabel(tr("Type:"));
    QComboBox *alignmentComboBox = new QComboBox;
    alignmentComboBox->addItem(tr("Left"));
    alignmentComboBox->addItem(tr("Centered"));
    alignmentComboBox->addItem(tr("Right"));

    alignmentLineEdit = new QLineEdit;
    alignmentLineEdit->setPlaceholderText("Placeholder Text");

QLineEdit prend en charge l’utilisation de input masks. Ceux-ci permettent uniquement à l’utilisateur de saisir dans la zone de saisie des caractères respectant une spécification simple. Nous construisons un groupe de widgets pour illustrer une sélection de masques prédéfinis :

    QGroupBox *inputMaskGroup = new QGroupBox(tr("Input mask"));

    QLabel *inputMaskLabel = new QLabel(tr("Type:"));
    QComboBox *inputMaskComboBox = new QComboBox;
    inputMaskComboBox->addItem(tr("No mask"));
    inputMaskComboBox->addItem(tr("Phone number"));
    inputMaskComboBox->addItem(tr("ISO date"));
    inputMaskComboBox->addItem(tr("License key"));

    inputMaskLineEdit = new QLineEdit;
    inputMaskLineEdit->setPlaceholderText("Placeholder Text");

Une autre fonctionnalité utile d’ QLineEdit est sa capacité à rendre son contenu en lecture seule. Cette propriété est utilisée pour contrôler l’accès à un champ de saisie dans le groupe de widgets suivant :

    QGroupBox *accessGroup = new QGroupBox(tr("Access"));

    QLabel *accessLabel = new QLabel(tr("Read-only:"));
    QComboBox *accessComboBox = new QComboBox;
    accessComboBox->addItem(tr("False"));
    accessComboBox->addItem(tr("True"));

    accessLineEdit = new QLineEdit;
    accessLineEdit->setPlaceholderText("Placeholder Text");

Maintenant que tous les widgets enfants ont été créés, nous connectons les signaux des listes déroulantes aux slots de l’objet ` Window ` :

    connect(echoComboBox, &QComboBox::activated,
            this, &Window::echoChanged);
    connect(validatorComboBox, &QComboBox::activated,
            this, &Window::validatorChanged);
    connect(alignmentComboBox, &QComboBox::activated,
            this, &Window::alignmentChanged);
    connect(inputMaskComboBox, &QComboBox::activated,
            this, &Window::inputMaskChanged);
    connect(accessComboBox, &QComboBox::activated,
            this, &Window::accessChanged);

Chacune de ces connexions utilise le signal ` QComboBox::activated()` qui fournit un entier au slot. Cela permettra d’apporter efficacement des modifications au champ de saisie de texte approprié dans chaque slot.

Nous plaçons chaque liste déroulante, chaque champ de saisie et chaque étiquette dans une disposition pour chaque zone de groupe, en commençant par la disposition de la zone de groupe « echoGroup » :

    QGridLayout *echoLayout = new QGridLayout;
    echoLayout->addWidget(echoLabel, 0, 0);
    echoLayout->addWidget(echoComboBox, 0, 1);
    echoLayout->addWidget(echoLineEdit, 1, 0, 1, 2);
    echoGroup->setLayout(echoLayout);

Les autres mises en page sont construites de la même manière :

    QGridLayout *validatorLayout = new QGridLayout;
    validatorLayout->addWidget(validatorLabel, 0, 0);
    validatorLayout->addWidget(validatorComboBox, 0, 1);
    validatorLayout->addWidget(validatorLineEdit, 1, 0, 1, 2);
    validatorGroup->setLayout(validatorLayout);

    QGridLayout *alignmentLayout = new QGridLayout;
    alignmentLayout->addWidget(alignmentLabel, 0, 0);
    alignmentLayout->addWidget(alignmentComboBox, 0, 1);
    alignmentLayout->addWidget(alignmentLineEdit, 1, 0, 1, 2);
    alignmentGroup-> setLayout(alignmentLayout);

    QGridLayout *inputMaskLayout = new QGridLayout;
    inputMaskLayout->addWidget(inputMaskLabel, 0, 0);
    inputMaskLayout->addWidget(inputMaskComboBox, 0, 1);
    inputMaskLayout->addWidget(inputMaskLineEdit, 1, 0, 1, 2);
    inputMaskGroup->setLayout(inputMaskLayout);

    QGridLayout *accessLayout = new QGridLayout;
    accessLayout->addWidget(accessLabel, 0, 0);
    accessLayout->addWidget(accessComboBox, 0, 1);
    accessLayout->addWidget(accessLineEdit, 1, 0, 1, 2);
    accessGroup->setLayout(accessLayout);

Enfin, nous plaçons chaque boîte de groupe dans une disposition en grille pour l'objet « Window » et définissons le titre de la fenêtre :

    QGridLayout *layout = new QGridLayout;
    layout->addWidget(echoGroup, 0, 0);
    layout->addWidget(validatorGroup, 1, 0);
    layout->addWidget(alignmentGroup, 2, 0);
    layout->addWidget(inputMaskGroup, 0, 1);
    layout->addWidget(accessGroup, 1, 1);
    setLayout(layout);

    setWindowTitle(tr("Line Edits"));
}

Les slots réagissent aux signaux émis lorsque l’utilisateur modifie les listes déroulantes.

Lorsque la liste déroulante de la zone de groupe « Echo » est modifiée, le slot « echoChanged() » est appelé :

void Window::echoChanged(int index)
{
    switch (index) {
    case 0:
        echoLineEdit->setEchoMode(QLineEdit::Normal);
        break;
    case 1:
        echoLineEdit->setEchoMode(QLineEdit::Password);
        break;
    case 2:
        echoLineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
        break;
    case 3:
        echoLineEdit->setEchoMode(QLineEdit::NoEcho);
        break;
    }
}

Le slot met à jour le champ de saisie de la même zone de groupe afin d’utiliser un mode d’écho correspondant à l’entrée décrite dans la liste déroulante.

Lorsque la liste déroulante de la zone de groupe « Validator » est modifiée, le slot « validatorChanged() » est appelé :

void Window::validatorChanged(int index)
{
    switch (index) {
    case 0:
        validatorLineEdit->setValidator(nullptr);
        break;
    case 1:
        validatorLineEdit->setValidator(new QIntValidator(
            validatorLineEdit));
        break;
    case 2:
        validatorLineEdit->setValidator(new QDoubleValidator(-999.0,
            999.0, 2, validatorLineEdit));
        break;
    }

    validatorLineEdit->clear();
}

Le slot crée soit un nouveau validateur destiné au champ de saisie, soit il supprime le validateur en cours d’utilisation en appelant ` QLineEdit::setValidator()` avec un pointeur nul. Dans ce cas, nous effaçons le champ de saisie afin de garantir que le nouveau validateur reçoive initialement une entrée valide avec laquelle travailler.

Lorsque la liste déroulante de la zone de groupe « Alignment » est modifiée, le slot « alignmentChanged() » est appelé :

void Window::alignmentChanged(int index)
{
    switch (index) {
    case 0:
        alignmentLineEdit->setAlignment(Qt::AlignLeft);
        break;
    case 1:
        alignmentLineEdit->setAlignment(Qt::AlignCenter);
        break;
    case 2:
        alignmentLineEdit->setAlignment(Qt::AlignRight);
        break;
    }
}

Cela modifie l’affichage du texte dans la zone d’édition afin qu’il corresponde à la description sélectionnée dans la liste déroulante.

Le slot « inputMaskChanged() » gère les modifications apportées à la liste déroulante de la zone de groupe « Input Mask » :

void Window::inputMaskChanged(int index)
{
    switch (index) {
    case 0:
        inputMaskLineEdit->setInputMask("");
        break;
    case 1:
        inputMaskLineEdit->setInputMask("+99 99 99 99 99;_");
        break;
    case 2:
        inputMaskLineEdit->setInputMask("0000-00-00");
        inputMaskLineEdit->setText("00000000");
        inputMaskLineEdit->setCursorPosition(0);
        break;
    case 3:
        inputMaskLineEdit->setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");
        break;
    }
}

Chaque entrée de la liste déroulante concernée est associée à un masque de saisie. On définit un nouveau masque en appelant la fonction QLineEdit::setInputMask() avec une chaîne de caractères appropriée ; le masque est désactivé si l’on utilise une chaîne vide.

Le slot accessChanged() gère les modifications apportées à la liste déroulante de la zone de groupe « Access » :

void Window::accessChanged(int index)
{
    switch (index) {
    case 0:
        accessLineEdit->setReadOnly(false);
        break;
    case 1:
        accessLineEdit->setReadOnly(true);
        break;
    }
}

Ici, nous associons simplement les entrées « False » et « True » de la liste déroulante aux valeurs « false » et « true » qui seront transmises à la fonction ` QLineEdit::setReadOnly()`. Cela permet à l'utilisateur d'activer et de désactiver la saisie dans le champ de saisie.

Exemple de projet sur code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.