QT-常用控件(四)-输入类
目录
QLineEdit(单行输入框)
QTextEdit(多行输入框)
QCombo Box(下拉框)
QSpin Box(微调框)
QLineEdit(单行输入框)
代码目的:让用户输入个人信息,并进行获取。
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);// 手机号码是有固定格式的. 此处的 0 代表 "数字"ui->lineEdit_phone->setInputMask("000-0000-0000");
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_submit_clicked()
{QString gender = ui->radioButton_male->isChecked() ? "男" : "女";qDebug() << "姓名: " << ui->lineEdit_name->text()<< "密码: " << ui->lineEdit_password->text()<< "性别: " << gender<< "电话: " << ui->lineEdit_phone->text();
}
ui->lineEdit_phone->setInputMask大的限制能力比较弱,如果不满足需求可以考虑使用正则表达式。
使用样例1:
//创建正则表达式
QRegExp regExp("^1\\d{10}$");
用户输入内容符合要求则可提交,否则eable=flase;
^n:表示以n开始
\\d{10}:表示必须重复10次出现数字,\d表示数字,\\进行转义,{10}表示进行重复10次操作;
$:结尾;
//创建验证器(验证正则表达式是否正确)
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
我们期望的是内容发生改变时,时刻进行验证,看用户输入的内容是否符合要求,符合要求按钮可用,否则不可用。
因此我们需要用到行文本框的textChanged或者textEdited属性。
void Widget::on_lineEdit_textEdited(const QString &text)
{int pos=0;QString content=text;//调用验证器,并验证,返回值是枚举类型(通过/不通过)//验证通过if(ui->lineEdit->validator()->validate(content,pos)==QValidator::Acceptable){ui->pushButton->setEnabled((true));}else{ui->pushButton->setEnabled((false));}
}
在调用是需要注意传参,第一个参数是要验证的字符串,第二个参数是错误出现时错误位置(int)。
在函数传参是参数是const的,而调用传参是非const,因此不能直接调用待检测字符串,可以进行拷贝,我们也可以自定义进行重写,也可以调用QT封装的QRegExpValidator;
正则表达式的运用
仔细观察发现:
当数字串长度不满足11位时,按钮不可用,等于11时可用,且不可以超过11位。
使用样例2:验证两次输入密码一致:
使用样例3:复选框实现密码显示与隐式的切换
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);ui->lineEdit->setEchoMode(QLineEdit::Password);
}Widget::~Widget()
{delete ui;
}void Widget::on_checkBox_toggled(bool checked)
{if(checked){ui->lineEdit->setEchoMode(QLineEdit::Normal);}else{ui->lineEdit->setEchoMode(QLineEdit::Password);}
}
QTextEdit(多行输入框)
QTextEdit 支持多行文本输入,还可进行富文本编辑,适用于备注、文章内容等大量文本输入场景
核心功能与信号
- 多行输入:天然支持多行文本,用户可自由换行输入。
- 富文本支持:能设置文本的字体、颜色、字号等样式,例如
ui->textEdit->setFontWeight(QFont::Bold)
可将文本设为粗体。 - 文本变化信号:
textChanged
信号在文本内容发生改变时触发,可用于实时监控文本变化,如自动保存草稿等功能。 - 内容获取与设置:通过
toPlainText()
获取纯文本内容,setPlainText(const QString &text)
设置纯文本内容;若需富文本操作,可使用toHtml()
和setHtml(const QString &html)
。
核心信号:
QCombo Box(下拉框)
核心方法
- 添加选项:
addItem(const QString &text)
可添加单个选项,addItems(const QStringList &texts)
可批量添加多个选项。 - 插入选项:
insertItem(int index, const QString &text)
能在指定索引位置插入选项。 - 设置当前选项:
setCurrentIndex(int index)
或setCurrentText(const QString &text)
可设置当前选中的选项。 - 获取当前选项:
currentIndex()
获取当前选项的索引,currentText()
获取当前选项的文本内容。
核心信号:
样例:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <fstream>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 需要读取文件内容,把文件中的每一行读取出来,作为一个 ComboBox 的选项std::ifstream file("C:/Users/1/Desktop/config.txt");if (!file.is_open()) {qDebug() << "文件打开失败";return;}// 按行来读取文本内容.// getline 函数完成.std::string line;while (std::getline(file, line)) {// 取到的每一行内容,设置到下拉框中.ui->comboBox->addItem(QString::fromStdString(line));}file.close();
}Widget::~Widget()
{delete ui;
}
QSpin Box(微调框)
QSpinBox 用于输入整数,带有上下调节按钮,方便用户微调数值;若需输入浮点数,可使用 QDoubleSpinBox。
属性
- 数值范围:
setRange(int min, int max)
设置数值的最小和最大值,限制输入范围。 - 步长:
setSingleStep(int step)
设置点击上下按钮时数值的变化步长。 - 初始值:
setValue(int val)
设置初始显示的数值。
信号
- 数值变化信号:
valueChanged(int i)
在数值发生改变时触发,可用于联动其他控件或执行相应逻辑。
样例:选餐
// 初始化下拉菜单
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("可乐");// 针对 QSpinBox 的范围进行设置
ui->spinBox->setRange(1, 5);
ui->spinBox_2->setRange(1, 5);
ui->spinBox_3->setRange(1, 5);ui->spinBox->setValue(1);
ui->spinBox_2->setValue(1);
ui->spinBox_3->setValue(1);