一、QLineEdit
QLineEdit 用来表示单行输入框. 可以输入一段文本, 但是不能换行
| 属性 | 说明 |
|---|---|
| text | 输入框中的文本 |
| inputMask | 输入内容格式约束 |
| maxLength | 最大长度 |
| frame | 是否添加边框 |
| echoMode | 显示方式:QLineEdit::Normal :这是默认值,文本框会显示输入的文本;QLineEdit::Password :在这种模式下,输入的字符会被隐藏,通常用星号(*)或等号(=)代替;QLineEdit::NoEcho :在这种模式下,文本框不会显示任何输入的字符 |
| cursorPosition | 光标所在位置 |
| alignment | 文字对齐方式, 设置水平和垂直方向的对齐 |
| dragEnabled | 是否允许拖拽 |
| readOnly | 是否是只读的(不允许修改) |
| placeHolderText | 当输入框内容为空的时候, 显示什么样的提示信息 |
| clearButtonEnabled | 是否会自动显示出 "清除按钮"" |
核心信号
| 属性 | 说明 |
|---|---|
| void cursorPositionChanged(int old, int new) | 当鼠标移动时发出此信号,old为先前的位置,new为新位置 |
| void editingFinished() | 当按返回或者回车键时,或者行编辑失去焦点时,发出此信号 |
| void returnPressed() | 当返回或回车键按下时发出此信号,如果设置了验证器, 必须要验证通过,才能触发 |
| void selectionChanged() | 当选中的文本改变时,发出此信号 |
| void textChanged(const QString &text) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改能够触发这个信号 |
| void textEdited(const QString &text)) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。代码对文本的修改不能触发这个信号 |
代码样例(录入个人信息):
首先,创建三个lineEdit,两个radioButton和一个pushButton

编写widget.cpp文件
cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//首先先编辑第一个输入框
ui->lineEdit_name->setPlaceholderText("请输入姓名");
ui->lineEdit_name->setClearButtonEnabled(true);
//编辑第二个输入框
ui->lineEdit_password->setPlaceholderText("请输入密码");
ui->lineEdit_password->setClearButtonEnabled(true);
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
//编辑第三个输入框
ui->lineEdit_phone->setPlaceholderText("请输入您的电话号码");
ui->lineEdit_phone->setClearButtonEnabled(true);
ui->lineEdit_phone->setInputMask("000_0000_0000");
}
Widget::~Widget()
{
delete ui;
}
运行一下代码:

继续修改,添加按钮的槽函数:

运行代码:

inputMask 只能进行简单的输入格式校验.,实际开发中, 基于正则表达式的方式是更核心的方法
正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串中字符组合的模式,它使用特殊的字符序列来描述字符串的规则,从而可以方便地进行字符串的查找、替换、验证等操作。
使用正则表达式样例:
首先先创建一个lineEdit和一个按钮

接着,编写widget.cpp文件
- 创建 QRegExp 对象来定义正则表达式 "^1\d{10}$",该表达式表示"以数字1开头,后接任意10位数字"的格式。
- 通过 QRegExpValidator 创建验证器对象。Qt 框架内置提供了四种主要类型的验证器。

cpp
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置按钮默认是禁用状态
ui->pushButton->setEnabled(false);
//给lineEdit注册一个validator
ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^1\\d{10}$")));
}
Widget::~Widget()
{
delete ui;
}
编写 widget.cpp, 给 lineEdit 添加 textEdited 信号的 slot 函数
cpp
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
qDebug() << arg1;
QString content = arg1;
int pos = 0;
/*通过 validate ⽅法验证⽂本是否符合要求
第⼀个参数填写的是要验证的字符串. 由于参数要求是 QString& ⽽不是 const
QString& , 需要把这个变量复制⼀下
第⼆个参数是⼀个 int&, 是输出型参数. 当验证的字符串不匹配时, 返回这个字符串的⻓度. (没有
啥实质作⽤)
返回值是⼀个枚举. QValidator::Acceptable 表⽰验证通过,QValidator::Invalid 表⽰验证不通过*/
if(ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable)
{
//验证通过设置按钮为可用状态
ui->pushButton->setEnabled(true);
}
else
{
ui->pushButton->setEnabled(false);
}
}
运行结果:

代码样例(验证两次输入的密码一致):
首先,在界面上创建两个输入框和⼀个 label

编写widget.cpp文件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setEchoMode(QLineEdit::Password);
ui->lineEdit_2->setEchoMode(QLineEdit::Password);
}
设置槽函数
cpp
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
(void)arg1;
const QString& s1 = ui->lineEdit->text();
const QString& s2 = ui->lineEdit_2->text();
//进行判断
if(s1.isEmpty() && s2.isEmpty())
{
ui->label->setText("密码为空");
}
else if(s1 == s2)
{
ui->label->setText("密码相同");
}
else
{
ui->label->setText("密码不同");
}
}
void Widget::on_lineEdit_2_textEdited(const QString &arg2)
{
(void)arg2;
const QString& s1 = ui->lineEdit->text();
const QString& s2 = ui->lineEdit_2->text();
//进行判断
if(s1.isEmpty() && s2.isEmpty())
{
ui->label->setText("密码为空");
}
else if(s1 == s2)
{
ui->label->setText("密码相同");
}
else
{
ui->label->setText("密码不同");
}
}
运行结果:

代码示例(切换显示密码):
首先,创建一个输入框和一个复选按钮

修改widget.cpp文件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
添加槽函数
cpp
void Widget::on_checkBox_toggled(bool checked)
{
if(checked)
{
ui->lineEdit->setEchoMode(QLineEdit::Normal);
}
else
{
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
}
运行代码:

二、QTextEdit
QTextEdit 是一个多行文本输入控件,同时支持富文本和 Markdown 编辑功能。当内容超出编辑区域时,它会自动显示滚动条。
| 属性 | 说明 |
|---|---|
| markdown | 输入框中的内容支持Markdown格式,系统会自动将Markdown文本渲染为HTML格式显示 |
| html | 输入框支持多种HTML标签内容,包括图片(img)和表格(table)等常见元素。 |
| placeHolderText | 输入框为空的时候提示的内容 |
| readOnly | 是否是只读的 |
| undoRedoEnable | 是否开启 undo 或 redo 功能:按下 ctrl + z 触发 undo;按下 ctrl + y 触发 redo |
| autoFormating | 开启自动格式化 |
| tabstopWidth | 按下缩进占多少空间 |
| overwriteMode | 是否开启覆盖写模式 |
| acceptRichText | 是否接收富文本内容 |
| verticalScrollBarPolicy | 垂直方向滚动条的出现策略:Qt::ScrollBarAsNeeded : 根据内容自动决定是否需要滚动条,这是默认值;Qt::ScrollBarAlwaysOff : 总是关闭滚动条;Qt::ScrollBarAlwaysOn : 总是显示滚动条 |
| horizontalScrollBarPolicy | 水平方向滚动条的出现策略:Qt::ScrollBarAsNeeded : 根据内容自动决定是否需要滚动条,这是默认值;Qt::ScrollBarAlwaysOff : 总是关闭滚动条;Qt::ScrollBarAlwaysOn : 总是显示滚动条 |
核心信号
| 信号 | 说明 |
|---|---|
| textChanged() | 文本内容改变时触发 |
| selectionChanged() | 选中范围改变时触发 |
| cursorPositionChanged() | 光标移动时触发 |
| undoAvailable(bool) | 可以进行 undo 操作时触发 |
| redoAvailable(bool) | 可以进行 redo 操作时触发 |
| copyAvaiable(bool) | 文本被选中/取消选中时触发 |
代码样例(获取多行输入框的内容):
首先,创建一个多行输入框和一个label

为多行输入框添加 slot 函数来处理 textChanged 信号:
使用 toPlainText 方法获取文本框内的纯文本内容
QTextEdit 还提供了 toMarkdown 和 toHtml 方法,可根据实际需求选择合适的文本获取方式
cpp
void Widget::on_textEdit_textChanged()
{
const QString& content = ui->textEdit->toPlainText();
qDebug() << content;
ui->label->setText(content);
}
运行代码:

代码样例(验证输入框的各种信号):
首先,创建一个多行输入框

给输入框添加几个槽函数
cpp
//文本内容改变时触发该信号
void Widget::on_textEdit_textChanged()
{
qDebug() << "[textChanged]" << ui->textEdit->toPlainText();
}
//选中范围改变时触发该信号
void Widget::on_textEdit_selectionChanged()
{
//QTextEdit中有一个QTextCursor对象,通过该对象可以获取到光标位置和选中的内容
const QTextCursor& cursor = ui->textEdit->textCursor();
qDebug() << "[selectionChanged]" << cursor.selectedText();
}
//光标移动时触发该信号
void Widget::on_textEdit_cursorPositionChanged()
{
const QTextCursor& cursor = ui->textEdit->textCursor();
qDebug() << "[cursorPositionChanged]" << cursor.position();
}
//可以进行undo操作的时候触发
void Widget::on_textEdit_undoAvailable(bool b)
{
qDebug() << "[undoAvailable]" << b;
}
//可以在redo操作的时候触发
void Widget::on_textEdit_redoAvailable(bool b)
{
qDebug() << "[redoAvailable]" << b;
}
//文本被选中或者取消选中的时候触发
void Widget::on_textEdit_copyAvailable(bool b)
{
qDebug() << "[copyAvailable]" << b;
}
运行代码:

三、QComboBox
QComboBox 表示下拉框
| 属性 | 说明 |
|---|---|
| currentText | 当前选中的文本 |
| currentIndex | 当前选中的条目下标,从 0 开始计算. 如果当前没有条目被选中, 值为 -1 |
| editable | 是否允许修改,设为 true 时, QComboBox 的行为就非常接近 QLineEdit , 也可以设置 validator |
| iconSize | 下拉框图标 (小三角) 的大小 |
| maxCount | 最多允许有多少个条目 |
核心方法
| 方法 | 说明 |
|---|---|
| addItem(const QString&) | 添加⼀个条目 |
| currentIndex() | 获取当前条目的下标,从 0 开始计算. 如果当前没有条目被选中, 值为 -1 |
| currentText() | 获取当前条目的文本内容 |
核心信号
| 信号 | 说明 |
|---|---|
| activated(int)、activated(const QString & text) | 当用户选择了⼀个选项时发出,这个时候相当于用户点开下拉框, 并且鼠标划过某个选项,此时还没有确认做出选择 |
| currentIndexChanged(int)、currentIndexChanged(const QString& text) | 当前选项改变时发出,此时用户已经明确的选择了⼀个选项,用户操作或者通过程序操作都会触发这个信号 |
| editTextChanged(const QString &text) | 当编辑框中的文本改变时发出(editable 为 true 时有效) |
代码样例(使用下拉框模拟麦当劳点餐):
首先,在界面上创建三个下拉框和一个按钮

再编写widget.cpp文件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//初始化三个下拉框
ui->comboBox->addItem("板烧鸡腿堡");
ui->comboBox->addItem("香辣鸡腿堡");
ui->comboBox->addItem("培根疏萃堡");
ui->comboBox_2->addItem("薯条");
ui->comboBox_2->addItem("鸡块");
ui->comboBox_2->addItem("薯饼");
ui->comboBox_3->addItem("可乐");
ui->comboBox_3->addItem("热巧克力");
ui->comboBox_3->addItem("牛奶");
}
编写按钮的槽函数
cpp
void Widget::on_pushButton_clicked()
{
qDebug() << "汉堡选择" << ui->comboBox->currentText();
qDebug() << "小食选择" << ui->comboBox_2->currentText();
qDebug() << "饮料选择" << ui->comboBox_3->currentText();
}
运行代码:

代码样例(从文件中加载下拉框选项):
首先,在界面创建一个下拉框:

创建一个文件

修改widget.cpp文件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//打开文件
std::ifstream file("d:/config.txt");
std::string line;
//读取每一行
while(std::getline(file, line))
{
ui->comboBox->addItem(QString::fromStdString(line));
}
file.close();
}
运行代码:

四、QSpinBox
使用 QSpinBox 或 QDoubleSpinBox 来表示"数值输入框",这是一种带有增减按钮的输入控件。它专门用于输入整数或浮点数,用户可以通过点击按钮来调整数值大小。
| 属性 | 说明 |
|---|---|
| value | 存储的数值 |
| singleStep | 每次调整的 "步长", 按下一次按钮数据变化多少 |
| displayInteger | 数字的进制 |
| minimum | 最小值 |
| maximum | 最大值 |
| suffix | 后缀 |
| prefix | 前缀 |
| wrapping | 是否运行换行 |
| frame | 是否带边框 |
| alignment | 文字对齐方式 |
| readOnly | 是否允许修改 |
| buttonSymbol | 按钮上的图标:UpDownArrows 上下箭头形式;PlusMinus 加减号形式;NoButtons 没有按钮 |
| accelerated (加速的) | 按下按钮时是否为快速调整模式 |
| correctionMode | 输入有误时如何修正:QAbstractSpinBox::CorrectToPreviousValue:当用户输入无效值时(比如在仅支持正整数的SpinBox中输入负数),控件会自动恢复为前一个有效值。例如,若SpinBox当前值为1,用户输入-1(无效值)后,数值将自动回退到1;QAbstractSpinBox::CorrectToNearestValue:当用户输入无效值时,SpinBox会自动调整为最接近的有效值。例如,若SpinBox初始值为1,用户输入无效值-1时,系统会将其修正为0。 |
| keyboardTrack | 是否开启键盘跟踪:设为 true, 每次在输入框输入一个数字, 都会触发一次 valueChanged() 和textChanged() 信号;设为 false, 只有在最终按下 enter 或者输入框失去焦点, 才会触发valueChanged() 和 textChanged() 信号 |
核心信号
| 信号 | 说明 |
|---|---|
| textChanged(QString) | 微调框的文本发生改变时会触发,参数 QString 带有 前缀 和 后缀 |
| valueChanged(int) | 微调框的文本发生改变时会触发,参数 int, 表示当前的数值. |
代码样例(调整麦当劳购物车中的份数):
首先,在界面上创建三个下拉框、三个微调框和一个按钮

编写widget.cpp文件
cpp
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//初始化下拉框
ui->comboBox->addItem("板烧鸡腿堡");
ui->comboBox->addItem("香辣鸡腿堡");
ui->comboBox->addItem("双层吉士堡");
ui->comboBox_2->addItem("薯条");
ui->comboBox_2->addItem("薯饼");
ui->comboBox_2->addItem("鸡块");
ui->comboBox_3->addItem("可乐");
ui->comboBox_3->addItem("热咖啡");
ui->comboBox_3->addItem("热牛奶");
//初始化微调框,设置取值范围
ui->spinBox->setValue(1);
ui->spinBox->setRange(1, 10);
ui->spinBox_2->setValue(1);
ui->spinBox_2->setRange(1, 10);
ui->spinBox_3->setValue(1);
ui->spinBox_3->setRange(1, 10);
}
运行代码:
