Auf dieser Seite

Beispiel für Zeilenbearbeitung

Das Beispiel „Line Edits“ veranschaulicht die vielfältigen Einsatzmöglichkeiten der Klasse „ QLineEdit “ und zeigt die Auswirkungen verschiedener Eigenschaften und Validatoren auf die vom Benutzer eingegebenen und ausgegebenen Daten.

Anwendung mit verschiedenen Arten und Verwendungszwecken von Zeilenbearbeitungen

Das Beispiel besteht aus einer einzigen „ Window “-Klasse, die eine Auswahl an Zeilenfeldern mit unterschiedlichen Eingabebeschränkungen und Anzeigeeigenschaften enthält, die durch Auswahl von Elementen aus Kombinationsfeldern geändert werden können. Die gemeinsame Darstellung dieser Elemente hilft Entwicklern bei der Auswahl geeigneter Eigenschaften für Zeilenfelder und erleichtert den Vergleich der Auswirkungen der einzelnen Validatoren auf die Benutzereingaben.

Definition der Fensterklasse

Die Klasse „ Window “ erbt von „ QWidget “ und enthält einen Konstruktor sowie mehrere 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;
};

Die Slots dienen dazu, den Typ des für ein bestimmtes Zeileneditfeld verwendeten Validators zu aktualisieren, wenn in der zugehörigen Kombinationsliste ein neuer Validator ausgewählt wurde. Die Zeileneditfelder werden im Fenster gespeichert, um in diesen Slots verwendet werden zu können.

Implementierung der Fensterklasse

Der Konstruktor von „ Window “ dient dazu, die Zeilenbearbeitungsfelder, Validatoren und Kombinationsfelder einzurichten, Signale von den Kombinationsfeldern mit Slots in der Klasse „ Window “ zu verbinden und die untergeordneten Widgets in Layouts anzuordnen.

Wir beginnen mit der Erstellung eines ` group box `, das ein Label, eine Combobox und ein Line-Edit-Feld enthält, um die Eigenschaft ` QLineEdit::echoMode ` zu veranschaulichen:

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();

Zu diesem Zeitpunkt wurde noch keines dieser Widgets in Layouts angeordnet. Später werden die „ echoLabel “, „ echoComboBox “ und „ echoLineEdit “ in einem vertikalen Layout innerhalb des Gruppenfelds „ echoGroup “ platziert.

In ähnlicher Weise erstellen wir Gruppenfelder und Sammlungen von Widgets, um die Auswirkungen von „ QIntValidator “ und „ QDoubleValidator “ auf den Inhalt eines Zeilenbearbeitungsfelds zu veranschaulichen:

    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");

Die Textausrichtung wird anhand einer weiteren Gruppe von Widgets veranschaulicht:

    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 unterstützt die Verwendung von „ input masks “. Diese erlauben es dem Benutzer lediglich, Zeichen in das Zeileneditfeld einzugeben, die einer einfachen Vorgabe entsprechen. Wir erstellen eine Gruppe von Widgets, um eine Auswahl vordefinierter Masken zu demonstrieren:

    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");

Eine weitere nützliche Funktion von „ QLineEdit “ ist die Möglichkeit, den Inhalt schreibgeschützt zu machen. Diese Eigenschaft wird verwendet, um den Zugriff auf ein Eingabefeld in der folgenden Gruppe von Widgets zu steuern:

    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");

Nachdem nun alle untergeordneten Widgets erstellt wurden, verbinden wir Signale aus den Comboboxen mit Slots im „ Window “-Objekt:

    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);

Jede dieser Verbindungen nutzt das Signal ` QComboBox::activated()`, das dem Slot eine Ganzzahl übergibt. Dies wird verwendet, um Änderungen am entsprechenden Zeilenbearbeitungsfeld in jedem Slot effizient vorzunehmen.

Wir platzieren jede Combobox, jedes Zeilenbearbeitungsfeld und jede Beschriftung in einem Layout für jede Gruppenbox, beginnend mit dem Layout für die Gruppenbox „ 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);

Die anderen Layouts werden auf die gleiche Weise erstellt:

    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);

Abschließend platzieren wir jede Gruppenbox in einem Rasterlayout für das „ Window “-Objekt und legen den Fenstertitel fest:

    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"));
}

Die Slots reagieren auf Signale, die ausgesendet werden, wenn der Benutzer die Kombinationsfelder ändert.

Wenn die Combobox der Gruppenbox „ Echo “ geändert wird, wird der Slot „ echoChanged() “ aufgerufen:

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;
    }
}

Der Slot aktualisiert das Line-Edit-Feld in derselben Gruppenbox so, dass es einen Echo-Modus verwendet, der dem in der Combobox beschriebenen Eintrag entspricht.

Wenn die Combobox der Gruppenbox „ Validator “ geändert wird, wird der Slot „ validatorChanged() “ aufgerufen:

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();
}

Der Slot erstellt entweder einen neuen Validator für das Eingabefeld oder entfernt den derzeit verwendeten Validator, indem er ` QLineEdit::setValidator()` mit einem Nullzeiger aufruft. In diesem Fall löschen wir das Eingabefeld, um sicherzustellen, dass der neue Validator zunächst gültige Eingaben zur Verarbeitung erhält.

Wenn die Combobox für das Gruppenfeld „ Alignment “ geändert wird, wird der Slot „ alignmentChanged() “ aufgerufen:

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;
    }
}

Dadurch wird die Darstellung des Textes im Textfeld so angepasst, dass er der in der Kombinationsliste ausgewählten Beschreibung entspricht.

Der Slot „ inputMaskChanged() “ verarbeitet Änderungen an der Combobox im Gruppenfeld „ 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;
    }
}

Jeder Eintrag in der entsprechenden Combobox ist mit einer Eingabemaske verknüpft. Wir legen eine neue Maske fest, indem wir die Funktion ` QLineEdit::setInputMask()` mit einer geeigneten Zeichenkette aufrufen; die Maske wird deaktiviert, wenn eine leere Zeichenkette verwendet wird.

Der Slot „ accessChanged() “ verarbeitet Änderungen an der Combobox im Gruppenfeld „ Access “:

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

Hier ordnen wir den Einträgen „ False “ und „ True “ in der Combobox einfach die Werte „ false “ und „ true “ zu, die an „ QLineEdit::setReadOnly()“ übergeben werden sollen. Auf diese Weise kann der Benutzer die Eingabe im Eingabefeld aktivieren und deaktivieren.

Beispielprojekt @ 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.