QLineEdit 是一个单行文本编辑框;
QTextEdit 是一个多行文本编辑框,还可以进行富文本编辑;
QPlainTextEdit 是一个多行纯文本编辑框,相当于简化版的 QTextEdit;
在界面上拉一个 lineEdit 控件,和几个按钮:
代码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QMessageBox>
#include <QLineEdit>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// QLineEdit 是一个单行文本编辑框
ui->lineEdit->setText("The QLineEdit widget is a one-line text editor.");
}
Widget::~Widget()
{
delete ui;
}
// 向左删除一位字符
void Widget::on_btnBackspace_clicked()
{
// void QLineEdit::backspace()
// 如果 lineEdit 中没有选中文本,则删除光标左侧的一个字符;
// 如果选择了任何文本,则将光标移动到所选文本的开头,并从移动到的新位置开始,删除左侧的一个字符;
ui->lineEdit->backspace();
}
// 向左选择一位字符
void Widget::on_btnCursorBackward_clicked()
{
// void QLineEdit::cursorBackward(bool mark, int steps = 1)
// 向左移动光标,移动的字符个数由参数 steps 决定,默认为 1,即向左移动一个字符;
// 如果参数 mark 为 true,则光标向左移动过程中 经过的每一个字符都处于选中状态;
// 如果参数 mark 为 false,则清除选中的内容;
ui->lineEdit->cursorBackward(true, 1);
// void QLineEdit::cursorForward(bool mark, int steps = 1)
// 用法和 cursorBackward 一样,只不过是改成光标向右移动而已;
// 获取当前光标所在的位置
int position = ui->lineEdit->cursorPosition();
qDebug() << "当前光标位置:" << QString::number(position);
}
// 向左选择一个单词
void Widget::on_btnCursorWordBackward_clicked()
{
// void QLineEdit::cursorWordBackward(bool mark)
// 将光标向左移动一个单词;如果参数 mark 为 true,则该单词处于选中状态;
ui->lineEdit->cursorWordBackward(true);
// void QLineEdit::cursorWordForward(bool mark)
// 用法和 cursorWordBackward 一样,只不过把光标改成向右移动;
}
// 删除光标右侧一个字符
void Widget::on_btnDel_clicked()
{
// 如果没有选择文本,则删除光标右侧的一个字符。
// 如果选择了任何文本,测试发现,选择文本的方式不同,删除的效果也不同:
// 1、如果用鼠标从左向右选择文本,则光标移动到选中文本的右侧,然后再把光标右侧的一个字符删除;
// 2、如果用鼠标从右向左选择文本,则光标移动到选中文本的左侧,然后再把光标右侧的一个字符删除;
// 即用鼠标选择文本时,调用 del() 方法是会从光标最后在所的位置开始,删除光标右侧的一个字符;
// 3、如果使用 cursorBackward 或者 cursorWordBackward 方法向左选择字符 或 单词时,
// 调用 del() 方法时,会将选中的所有字符全部删除;
ui->lineEdit->del();
}
// 取消任何选定的文本。
void Widget::on_btnDeselect_clicked()
{
ui->lineEdit->deselect();
}
// 获取显示的文本
void Widget::on_btnDisplayText_clicked()
{
// displayText() 方法用于获取显示的文本;
// 如果 echoMode 是常规的,它将返回与 text() 相同的结果;
// 如果 echoMode 是 Password 或 PasswordEchoOnEdit,它将返回一个与平台相关的密码掩码字符串,
// 字符串大小为 text().length();
// 如果 echoMode 是 NoEcho,则返回空字符串;
QString text = ui->lineEdit->text();
qDebug() << "text():" << text.toUtf8().data();
QString disText = ui->lineEdit->displayText();
qDebug() << "displayText():" << disText.toUtf8().data();
}
// 选中从光标到行尾的所有字符
void Widget::on_btnEnd_clicked()
{
// 将光标移动到行尾;
// 如果参数为 true,则从光标位置开始到行尾的所有字符都将被选中;
// 如果参数为 false,则移动光标时,取消任何已经选中的文本;
ui->lineEdit->end(true);
// void QLineEdit::home(bool mark)
// 用法和 end() 一样,只不过是将光标移动到行首;
}
// 插入数据
void Widget::on_btnInsert_clicked()
{
// 从当前光标所在位置插入数据
ui->lineEdit->insert("锄禾日当午");
}
// 获取选中的文本;如果未选中,返回空字符串;
void Widget::on_btnSelectedText_clicked()
{
// 测试发现:点击按钮时,获取不到用鼠标选中的文本内容,
// 只能获取到 cursorBackward、cursorWordBackward、end 等方法选中的文本;
// 这是因为点击按钮时,焦点变到按钮上了,lineEdit 失去焦点了,即用鼠标选中的内容消失了;
// 而用 cursorBackward、cursorWordBackward、end 等方法选中的文本内容还是处于选中状态;
QString text = ui->lineEdit->selectedText();
qDebug() << "当前选中的文本:" << text.toUtf8().data();
}
// 设置居中显示
void Widget::on_btnAlignment_clicked()
{
ui->lineEdit->setAlignment(Qt::AlignCenter);
}
// 显示清除按钮
void Widget::on_btnShowClearBtn_clicked()
{
// true:表示在 lineEdit 不为空时,在控件尾部显示一个清除按钮;
// false:则不会显示清除按钮(默认);
ui->lineEdit->setClearButtonEnabled(true);
}
// 设置回显模式
void Widget::on_btnEchoMode_clicked()
{
// QLineEdit::Normal:常规模式,lineEdit 用于显示文本信息(默认);
// QLineEdit::NoEcho:不显示任何信息(即使输入信息,也不会显示);
// QLineEdit::Password:显示平台相关的密码掩码字符,而不是实际输入的字符;
// QLineEdit::PasswordEchoOnEdit:在编辑时显示正常字符,一旦退出编辑状态则显示密码字符;
ui->lineEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);
}
// 设置允许显示的最大字符数
void Widget::on_btnMaxLength_clicked()
{
ui->lineEdit->setMaxLength(50);
}
// 设置占位符(即提示信息)
void Widget::on_btnPlaceholderText_clicked()
{
ui->lineEdit->clear(); // 清除 lineEdit 上的文本信息
ui->lineEdit->setPlaceholderText("请输入密码"); // 设置提示信息
ui->lineEdit->setFocus(); // 设置 lineEdit 获取焦点
}
// 设置只读
void Widget::on_btnReadOnly_clicked()
{
ui->lineEdit->setReadOnly(true);
}
// 常用信号
void Widget::on_btnSignal_clicked()
{
// 光标位置改变触发的信号
connect(ui->lineEdit, &QLineEdit::cursorPositionChanged, [=](int oldPos, int newPos){
qDebug() << "cursorPositionChanged 信号:" << QString::number(oldPos) << QString::number(newPos);
});
// 编辑结束触发的信号
connect(ui->lineEdit, &QLineEdit::editingFinished, [=](){
qDebug() << "editingFinished 信号:" << ui->lineEdit->text();
});
// 选择文本改变时触发的信号
connect(ui->lineEdit, &QLineEdit::selectionChanged, [=](){
// 输出选中的文本信息:
qDebug() << "selectionChanged 信号:" << ui->lineEdit->selectedText();
});
}
// 常用槽函数
void Widget::on_btnSlot_clicked()
{
// void clear() // 清空
// void copy() const // 拷贝(将选中的文本复制到剪贴板,前提 echoMode 是 Normal)
// void cut() // 剪切(将选中的文本复制到剪贴板,并删除原文本,前提 echoMode 是 Normal)
// void paste() // 粘贴(将剪贴板的文本插入到当前光标所在的位置,如果 lineEdit 不是只读的,那么插入的时候会删除 lineEdit 中已选中的任何文本)
// void redo() // 重复最后一个操作
// void selectAll() // 选择所有文本,并将光标移动到末尾
// void setText(const QString &) // 设置文本内容
// void undo() // 撤销最后一个操作
}
添加自定义行为:
// 设置占位符
ui->lineEdit->setPlaceholderText("请输入密码");
ui->lineEdit->setEchoMode(QLineEdit::Password);
// 自定义行为:添加一个图标
QAction *leadingAction = new QAction(this);
leadingAction->setIcon(QIcon(":/Image/Luffy.png"));
// 将自定义行为添加到 lineEdit 的开始位置
ui->lineEdit->addAction(leadingAction, QLineEdit::LeadingPosition);
// 自定义行为:添加一个图标
QAction *trailingAction = new QAction(this);
trailingAction->setIcon(QIcon(":/Image/open.png"));
// 将自定义行为添加到 lineEdit 的尾部
ui->lineEdit->addAction(trailingAction, QLineEdit::TrailingPosition);
// 点击 lineEdit 尾部的自定义行为触发的信号
connect(trailingAction, &QAction::triggered, [=](){
if (ui->lineEdit->echoMode() == QLineEdit::Password)
{
trailingAction->setIcon(QIcon(":/Image/close.png"));
ui->lineEdit->setEchoMode(QLineEdit::Normal);
}
else
{
trailingAction->setIcon(QIcon(":/Image/open.png"));
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
});
三种状态的效果:
设置验证器:
// 设置占位符
ui->lineEdit_Int->setPlaceholderText("整数");
ui->lineEdit_Double->setPlaceholderText("小数");
ui->lineEdit_IDNum->setPlaceholderText("身份证号");
// 整数验证器
QIntValidator *intValidator = new QIntValidator(this);
intValidator->setRange(1, 999); // 设置验证器范围只能是 0 ~ 999
ui->lineEdit_Int->setValidator(intValidator); // 为编辑框设置验证器
// 小数验证器
QDoubleValidator *doubleValidator = new QDoubleValidator(this);
doubleValidator->setRange(-999, 999); // 设置验证器范围,允许负数
doubleValidator->setDecimals(2); // 设置精度为 2 位小数
// 设置字符串如何去描述数字的符号;
// QDoubleValidator::ScientificNotation:弦是用科学的形式写的,他可能有一个指数,例如 1.5E-2;(默认设置)
// QDoubleValidator::StandardNotation:字符串被写成标准数字,例如 0.015;
doubleValidator->setNotation(QDoubleValidator::StandardNotation);
ui->lineEdit_Double->setValidator(doubleValidator);
// 身份证号最多允许输入 18 个字符
ui->lineEdit_IDNum->setMaxLength(18);
// 正则表达式:前 17 位是任意数字,第 18 位是任意数字,或者 X;
// [0-9]{17} 表示 0-9 之间的任意数字出现 17 次;
// [0-9]|[X] 表示 0-9 之间的任意数字出现一次,[X] 就表示 X 出现一次,“|” 表示或者;
// () 的作用是分组,或者提升优先级;
QRegExp reg("[0-9]{17}([0-9]|[X])");
// 正则表达式验证器
QRegExpValidator *regValidator = new QRegExpValidator(this);
regValidator->setRegExp(reg);
// 为身份证号输入框设置正则表达式验证器
ui->lineEdit_IDNum->setValidator(regValidator);
效果:
输入数据的效果:
QTextEdit 是一个多行文本编辑框,允许富文本编辑:
很多功能都和 QLineEdit 类似,也有一些特殊的用法:
1、除了添加普通文本内容外,textEdit 还可以添加 html:
添加普通文本:
// setPlainText 和 insertPlainText 作用是一样的
ui->textEdit->setPlainText("<a href=\"http://www.baidu.com\">百度一下</a>");
// ui->textEdit->insertPlainText("<a href=\"http://www.baidu.com\">百度一下</a>");
效果:
添加 html:
// setHtml 和 insertHtml 作用一样
// ui->textEdit->setHtml("<a href=\"http://www.baidu.com\">百度一下</a>");
// ui->textEdit->insertHtml("<a href=\"http://www.baidu.com\">百度一下</a>");
// 测试发现 setText 也和 setHtml 作用一样
ui->textEdit->setText("<a href=\"http://www.baidu.com\">百度一下</a>");
效果:
2、设置换行模式:
// 设置换行模式
// QTextEdit::NoWrap:不换行
// QTextEdit::WidgetWidth:根据控件大小进行换行;换行保留完整单词,遇到空格换行;(默认)
ui->textEdit->setLineWrapMode(QTextEdit::WidgetWidth);
// 设置在单词中进行换行
// QTextOption::NoWrap:不换行
// QTextOption::WordWrap:按照单词换行
// QTextOption::ManualWrap:和 NoWrap 一样,表示不换行
// QTextOption::WrapAnywhere:在任意地方换行(会拆分单词,在单词中进行换行)
ui->textEdit->setWordWrapMode(QTextOption::WrapAnywhere);
3、在 textEdit 中添加图片:
ui->textEdit->textCursor().insertImage(QImage(":/Image/Luffy.png"));
效果: