【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
, Password
和PasswordEchoOnEdit
。
该设置会影响小部件的显示以及复制或拖动文本的能力。
默认情况下,此属性设置为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();
}