【Qt控件之QLineEdit】N多种用法及技巧

news/2024/8/26 16:22:27 标签: qt, 开发语言

【Qt控件之QLineEdit】N多种用法及技巧

      • 介绍
      • 用法
        • 用法1:信号触发
      • 用法2:添加动作
      • 用法3:删除光标最侧字符
      • 用法4:设置光标位置
      • 用法5:删除
      • 用法6:选择和取消选择
      • 用法7:不为空时是否显示清除按钮
      • 用法8:设置自动补全
      • 用法9:设置显示模式
      • 用法11:是否显示边框
      • 用法12:掩码输入
      • 用法13:设置最大长度
      • 用法14:设置编辑状态
      • 用法15:设置占位符
      • 用法16:是否只读
      • 用法17:选择文本
      • 示例
        • 示例1:设置验证器(正则表达式:限制只可输入`数字` `英文`和`下划线`)
        • 示例2:设置`显示模式`、`验证器`、`文本位置`、`掩码`和`是否只读`

介绍

QLineEdit是一个单行文本输入框,允许用户输入和编辑单行纯文本。
它提供了很多有用的编辑功能,包括撤销和重做、剪切和粘贴、以及拖放等。
同时,QLineEdit还可以通过改变void setEchoMode(EchoMode)来进行密码输入等操作,文本的长度也可以被限制为maxLength
此外,通过使用setValidator()或者setInputMask()可以限制QLineEdit输入的文本类型。

用法

QLineEdit类方法有很多,以下是其常用用法。

用法1:信号触发
	// 当光标的位置在文本编辑器中改变时,这个信号会被触发。old和new参数分别表示光标改变前后的位置。
    connect(ui->lineEdit, &QLineEdit::cursorPositionChanged, this, [=](int nOld, int nNew){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "nOld :" << nOld << "nNew :" << nNew;
    });
	// 当用户完成文本编辑(例如按下Enter键或点击其他区域使编辑结束)时,这个信号会被触发。
    connect(ui->lineEdit, &QLineEdit::editingFinished, this, [=](){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << ui->lineEdit->text();
    });
	// 当用户在文本编辑器中按下Enter键时,这个信号会被触发。
    connect(ui->lineEdit, &QLineEdit::returnPressed, this,  [=](){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << ui->lineEdit->text();
    });
	// 当文本编辑器中的选区发生变化时,这个信号会被触发。例如,当用户选择或取消选择文本时。
    connect(ui->lineEdit, &QLineEdit::selectionChanged, this,  [=](){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << ui->lineEdit->text();
    });
	// 当文本编辑器中的文本发生更改时,这个信号会被触发。参数text是改变后的文本内容。
    connect(ui->lineEdit, &QLineEdit::textChanged, this,  [=](const QString& text){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << text;
    });
	// 当文本编辑器开始编辑新的文本时,这个信号会被触发。参数text是当前编辑的文本内容。
    connect(ui->lineEdit, &QLineEdit::textEdited, this,  [=](const QString& text){
        qDebug().noquote() << "[" << __FILE__ << __LINE__ << "]" << "text :" << text;
    });

这些函数通常在特定的场合和情境下使用,例如在实现自定义的文本编辑器或创建复杂的用户界面时。
可以根据需要连接这些信号到自定义的槽函数,以处理特定的用户输入事件。

用法2:添加动作

可在编辑框内添加自定义动作,进行处理。

	// 创建动作,图标为库标准图标
    QAction* pAct = new QAction(style()->standardIcon(QStyle::SP_DialogOpenButton), "open", this);
    connect(pAct, &QAction::triggered, this, [=](){
       ui->lineEdit->setText("haha");
    });
    // 添加动作1,第二个参数为所在位置,当前是在编辑框后边
    ui->lineEdit->addAction(pAct, QLineEdit::TrailingPosition);
    // 添加动作2,位置在编辑框开始
    ui->lineEdit->addAction(style()->standardIcon(QStyle::SP_DialogOpenButton), QLineEdit::LeadingPosition);

界面如下:
在这里插入图片描述

用法3:删除光标最侧字符

如果没有选择任何文本,则删除文本光标左侧的字符,并将光标向左移动一个位置。如果选择了任何文本,则光标将移动到所选文本的开头并删除所选文本。

ui->lineEdit->backspace();

用法4:设置光标位置

设置光标位置

ui->lineEdit->setCursorPosition(3);

将文本光标移动到行首,除非它已经在行首。如果mark为true,则向第一个位置选择文本;否则,如果移动光标,则将取消选中所选文本。

ui->lineEdit->home(true);

将光标移回步进字符。如果mark为真,移动的每个字符将被添加到选择中;如果标记为假,则清除选择。

ui->lineEdit->cursorBackward(false, 2);

将光标向前移动字符。如果mark为真,移动的每个字符将被添加到选择中;如果标记为假,则清除选择。

ui->lineEdit->cursorForward(false, 1);

用法5:删除

如果未选中任何文本,则删除文本光标右侧的字符。如果选择了任何文本,则光标将移动到所选文本的开头并删除所选文本。

ui->lineEdit->del();

用法6:选择和取消选择

取消选择任何选定的文本。

ui->lineEdit->deselect();

用法7:不为空时是否显示清除按钮

此属性用于确定行编辑器在不为空时是否显示清除按钮。
如果启用,当行编辑包含一些文本时,该行编辑将显示一个后面的清除按钮,否则行编辑将不显示清除按钮(默认值)。

ui->lineEdit->setClearButtonEnabled(1);

用法8:设置自动补全

void QLineEdit::setCompleter(QCompleter *c)
设置这个行编辑器来提供自动补全,c.补全模式使用QCompleter::setCompletionMode()设置。
要将QCompleter与QValidator或QLineEdit::inputMask一起使用,您需要确保提供给QCompleter的模型包含有效的条目。您可以使用QSortFilterProxyModel来确保QCompleter的模型只包含有效的条目。
如果c == 0, setCompleter()将移除当前的补全器,有效地禁用自动补全。

    QStringList wordList;
    wordList << "alpha" << "omega" << "omicron" << "zeta";

    QCompleter *completer = new QCompleter(wordList, this);
    completer->setCaseSensitivity(Qt::CaseInsensitive);
    ui->lineEdit->setCompleter(completer);

在这里插入图片描述

用法9:设置显示模式

显示模式:enum EchoMode { Normal, NoEcho, Password, PasswordEchoOnEdit };
此属性保存行编辑器的回显模式
回显模式决定如何向用户显示(或回显)行编辑中输入的文本。
最常见的设置是Normal,其中用户输入的文本逐字显示,但QLineEdit也支持允许输入的文本被抑制或遮挡的模式:这些模式包括NoEcho, PasswordPasswordEchoOnEdit
该设置会影响小部件的显示以及复制或拖动文本的能力。
默认情况下,此属性设置为Normal

ui->lineEdit->setEchoMode(QLineEdit::Password);

在这里插入图片描述

用法11:是否显示边框

ui->lineEdit->setFrame(1);

用法12:掩码输入

此属性保存验证输入掩码

如果没有设置掩码,inputMask()返回一个空字符串。

设置QLineEdit的验证掩码。验证器可以代替掩码使用,也可以与掩码一起使用;看到setValidator()

通过传递一个空字符串(“”),取消掩码并返回到正常的QLineEdit操作。

下表显示了可以在输入掩码中使用的字符。在允许但不需要字符的情况下,需要使用空格字符(表示空白的默认字符)。

ui->lineEdit->setInputMask("000.000.000.000");

在这里插入图片描述

用法13:设置最大长度

中文,英文都占1个长度。

ui->lineEdit->setMaxLength(10);

用法14:设置编辑状态

此属性保存行编辑器的内容是否已被用户修改

修改后的标志永远不会被QLineEdit读取;它的默认值为false,并在用户更改行编辑器的内容时更改为true

这对于需要提供默认值但一开始不知道默认值应该是什么(可能取决于表单上的其他字段)的东西很有用。在没有最佳默认值的情况下开始行编辑,当默认值已知时,如果modified()返回false(用户没有输入任何文本),则插入默认值。

调用setText()将修改标志重置为false。

ui->lineEdit->setModified(1);

用法15:设置占位符

ui->lineEdit->setPlaceholderText("helloworld");

在这里插入图片描述

用法16:是否只读

ui->lineEdit->setReadOnly(1);

用法17:选择文本

ui->lineEdit->setSelection(0, 2);

示例

示例1:设置验证器(正则表达式:限制只可输入数字 英文下划线
ui->lineEdit->setValidator(new QRegularExpressionValidator(QRegularExpression("[0-9a-zA-A_]*")));
示例2:设置显示模式验证器文本位置掩码是否只读

先上UI:
根据选择,设置编辑框状态及可输入限制,代码内有注释。
在这里插入图片描述
.h

#ifndef WINDOW_H
#define WINDOW_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QComboBox;
class QLineEdit;
QT_END_NAMESPACE

//! [0]
class Window : public QWidget
{
    Q_OBJECT

public:
    Window();

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;      // 访问方式
};
//! [0]

#endif

.cpp

#include <QtWidgets>

#include "window.h"

//! [0]
Window::Window()
{
    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();
//! [0]

//! [1]
    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");
//! [1]

//! [2]
    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");
//! [2]

//! [3]
    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");
//! [3]

//! [4]
    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");
//! [4]

//! [5]
    connect(echoComboBox, SIGNAL(activated(int)),
            this, SLOT(echoChanged(int)));
    connect(validatorComboBox, SIGNAL(activated(int)),
            this, SLOT(validatorChanged(int)));
    connect(alignmentComboBox, SIGNAL(activated(int)),
            this, SLOT(alignmentChanged(int)));
    connect(inputMaskComboBox, SIGNAL(activated(int)),
            this, SLOT(inputMaskChanged(int)));
    connect(accessComboBox, SIGNAL(activated(int)),
            this, SLOT(accessChanged(int)));
//! [5]

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

//! [7]
    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);
//! [7]

//! [8]
    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"));
}
//! [8]

//! [9]
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);
    }
}
//! [9]

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

    validatorLineEdit->clear();
}
//! [10]

//! [11]
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);
    }
}
//! [11]

//! [12]
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;#");
    }
}
//! [12]

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

调用

#include <QApplication>

#include "window.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    Window window;
    window.show();
    return app.exec();
}

http://www.niftyadmin.cn/n/5145150.html

相关文章

【1day】宏景OA get_org_tree.jsp接口SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录

【jvm】方法的调用

目录 一、方法的调用二、非虚方法三、虚方法四、虚拟机调用指令4.1 普通调用指令4.2 动态调用指令 五、代码示例5.1 父类5.2 子类5.3 接口5.4 接口实现 六、方法指令七、说明八、invokedynamic指令8.1 说明8.2 代码示例8.3 main方法指令 九、方法重写的本质十、虚方法表 一、方…

AIOPS学习资源

时间序列分析-B站 时间序列分析的基础、原理、算法和应用-知乎 时间序列数据分析101 - (1) 一份全面详尽的时间序列入门教程-知乎-推荐 图解 72 个机器学习基础知识点-推荐 机器学习入门与核心概念-B站 机器学习&#xff1a;盘点最常见的7种数据预处理方法和原理-知乎

[题] 查找最大元素 #字符输入

题目&#xff1a;1381 查找最大元素 对于输入的每个字符串&#xff0c;查找其中的最大字母&#xff08;ASCII码最大&#xff09;&#xff0c;在该字母后面插入字符串“(max)”。 输入 输入数据包括多个测试实例&#xff0c;每个实例由一行长度不超过100的字符串组成&#xff0c…

【ML】线性回归

线性回归 以房价为例。 单因子线性回归 房价和面积建立回归模型。 多因子线性回归 房价和面积、收入、房龄、地区人口数建立回归模型。 线性回归模型评估 MSE 越小越好&#xff0c; R 2 R^2 R2越接近1越好 MSE&#xff08;预测值y 和实际值y’ 的均方误差&#xff09; …

MAA连不上MUMU模拟器

之前一直能正常用&#xff0c;最近突然连接不上&#xff0c;最终发现是adb版本不同造成的&#xff0c;我系统变量的adb版本如下&#xff1a; MUMU自带adb版本如下&#xff1a; 解决办法&#xff1a; 把mumu的adb复制到系统变量路径下&#xff0c;或者把adb的系统变量删除

如何实现异步通知的重试机制

工作中经常要和第三方做对接&#xff0c;比如支付、电子合同等系统。操作成功之后&#xff0c;第三方会发送异步的通知&#xff0c;返回最终的处理结果&#xff0c;使用异步而不是使用同步通知&#xff0c;是为了加快系统响应速度&#xff0c;防止线程阻塞。任务处理完成后通过…

【C++】C++11【上】列表初始化|声明|新容器|右值引用|完美转发|新的类功能

目录 1、 C11简介 2、 统一的列表初始化 2.1 &#xff5b;&#xff5d;初始化 2.2 std::initializer_list 3、声明 3.1 auto和范围for 3.1decltype 3.3 nullptr 4、新容器 5、 右值引用 5.1左值引用和右值引用 5.2 左值引用与右值引用比较 5.3 左值和右值引用使用场景及意义 6…