行编辑示例

行编辑示例演示了如何使用QLineEdit,并显示了各种属性和验证器对用户输入输出影响的示例。

示例由一个单独的Window类组成,包含一组行编辑,具有不同的输入约束和可以更改的显示属性,可以通过从组合框中选择项目来更改。将这些属性一起展示,有助于开发者选择适合行编辑使用的属性,并方便比较每个验证器对用户输入的影响。

窗口类定义

Window类继承自QWidget并包含一个构造函数和几个槽

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

这些槽用于在相关的组合框中选择新的验证器时更新特定行编辑所使用的验证器类型。行编辑存储在窗口中,以便在这些槽中使用。

窗口类实现

Window构造函数用于设置行编辑、验证器和组合框,将组合框的信号连接到Window类中的槽,并排列子小部件。

我们首先构建一个group box来包含一个标签、组合框和行编辑,以便我们可以展示QLineEditechoMode属性。

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

到目前为止,这些小部件还没有进行布局排列。最终,echoLabelechoComboBoxechoLineEdit将被放置在echoGroup分组框内的垂直布局中。

同样,我们构建分组框和一组小部件以展示QIntValidatorQDoubleValidator对行编辑内容的影响

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

文本对齐通过另一组小部件进行演示

    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支持使用input masks。这些仅允许用户在行编辑中输入遵循简单指定的字符。我们构建一组小部件来演示预定义面具的选择

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

QLineEdit的另一个有用特性是它可以使其内容只读。此属性用于在下一组小部件中控制对行编辑的访问

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

现在所有子小部件已构建,我们将组合框的信号连接到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);

每个这些连接都使用了QComboBox::activated()信号,向槽中提供一个整数。这将被用来在各个槽中有效地更改适当的行编辑。

我们将每个组合框、行编辑和标签放置在每个分组框的布局中,从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);

其他布局以相同的方式构建

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

最后,我们将每个分组框放置在Window对象的网格布局中,并设置窗口标题

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

槽响应用户更改组合框时发出的信号。

当更改了Echo分组框的组合框时,会调用echoChanged()

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

该槽会更新同一分组框中的行编辑,使用与组合框中描述的条目相对应的回显模式。

当更改了Validator分组框的组合框时,会调用validatorChanged()

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

该槽或者为行编辑创建新的验证器,或者通过调用QLineEdit::setValidator()以零指针来移除正在使用的验证器。在这种情况下,我们清除行编辑以确保新的验证器最初有有效输入。

当更改了Alignment分组框的组合框时,会调用alignmentChanged()

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

这将根据组合框中选定的描述更改行编辑中文本的显示方式。

inputMaskChanged()槽处理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;
    }
}

相关组合框中的每一项都与一个输入掩码关联。我们通过使用合适的字符串调用QLineEdit::setInputMask()函数来设置新的掩码;如果使用空字符串,掩码将禁用。

accessChanged()槽处理Access分组框中组合框的更改

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

在这里,我们只是将组合框中的FalseTrue条目与QLineEdit::setReadOnly传递的falsetrue值关联。这允许用户启用和禁用行编辑的输入。

示例项目 @ code.qt.io

© 2024 The Qt Company Ltd. 本文件中包含的文档贡献的版权归其各自的拥有者所有。本文件中提供的文档受GNU自由文档许可证版本1.3的条款约束,由自由软件基金会发布。Qt以及相应的标志是The Qt Company Ltd.在芬兰和/或其他国家的商标。所有其他商标均为其各自的拥有者的财产。