【Qt开发】输入类控件
目录
1,Line Edit
2,Line Edit代码运用
2-1,正则表达式
3,Text Edit
4,Combo Box
5,Spin Box
6,Date Edit和Time Edit
7,Dial
8,Slider
1,Line Edit
QLineEdit 用来表示单行输入框。它可以输入一段文本,但是不能换行,因为它是单行输入框。其核心属性和核心信号如下。
2,Line Edit代码运用
这里运用 Line Edit 来实现录入个人信息的情况。
// 初始化文本数据
ui->label1->setText("姓名");
ui->lineEdit1->setPlaceholderText("请输⼊姓名");
ui->radioButton1->setText("男");
ui->radioButton2->setText("女");
ui->label2->setText("电话");
ui->lineEdit2->setPlaceholderText("请输入电话");
ui->pushButton->setText("确定");
// 设置属性
ui->lineEdit1->setClearButtonEnabled(true); // 清空按钮
// 设置输入格式。此处的0代表“数字”。此时输入的格式为123-4567-4567这种形式
ui->lineEdit2->setInputMask("000-0000-0000");
void Widget::on_pushButton_clicked()
{
QString gender = ui->radioButton1->isChecked() ? "男" : "⼥";
qDebug() << "姓名: " << ui->lineEdit1->text()
<< "性别: " << gender
<< "⼿机: " << ui->lineEdit2->text();
}
2-1,正则表达式
Line Edit 属性中的 inputMask 只能进行简单的输入格式校验。实际开发中,基于正则表达式的校验方式是更核心的方法。
正则表达式本质上就是一个带有特殊字符的字符串。这个特殊字符是用来表示另一个字符串的特征。还有,正则表达式的语法比较复杂,一般都是随用随查,不需要背下来。
正则表达式⽂档 正则表达式在线测试工具
Qt中,使用 QRegExp 创建一个正则表达式对象,它通过正则表达式匹配来过滤掉非法输入。为了将它运用到控件中,还需要创建一个 QRegExpValidator 验证器,并将正则表达式作为参数传递给它。最后把验证器应用到控件上即可。
在控制输入格式时,通常会 textChanged 或 textEdited 信号来处理输入内容非法或合法的情况。Qt中的控件借助 QValidator 抽象类(不能实例化出对象)中的 validate(QString& input, int& pos) 虚函数来验证输入的合法性。参数 input 代表输入的内容;pos 表示输入光标的位置,此参数通常直接设为0即可。validate函数返回值一个枚举值,这个枚举有三个值,代表输入的不同状态。即 QValidator::Acceptable 输入完全合法、QValidator::Invalid 输入不合法、QValidator::Intermediate 输入目前还不完整。
ui->pushButton->setText("提交");
// 定义正则表达式regExp里面的字符串是什么形式的。
// ^表示以什么开头,\d表示十进制数字(这里需要\\d在C++中转义成\d),{10}表示这个数字可以出现10次,$表示这是结尾
QRegExp regExp("^1\\d{10}$"); // 表示以1开头,后面有10个十进制数字
// 创建validator验证器对象,将正则表达式regExp作为其规则参数,把验证器应用到lineEdit控件上
QRegExpValidator* validator = new QRegExpValidator(regExp, ui->lineEdit);
ui->lineEdit->setValidator(validator);
// ui->lineEdit->setValidator(new QRegExpValidator(regExp)); 直接一步到位
void Widget::on_lineEdit_textEdited(const QString &text)
{
QString content = text;
int pos = 0;
if (ui->lineEdit->validator()->validate(content, pos) == QValidator::Acceptable) {
// 验证通过
ui->pushButton->setEnabled(true);
} else {
// 验证不通过
ui->pushButton->setEnabled(false);
}
}
注意:在类型这块出现的警告,可以强转(void)来避免。
Qt 中除了 QRegExpValidator 验证器外,还内置了四个主要的验证器对象。
3,Text Edit
QTextEdit 表示多行输入框,用于编辑和显示多行纯文本和富文本(HTML格式)。它比 QLineEdit 更加灵活,因为它支持多行文本输入、文本格式化等更多功能。
Qt中还有一个与QTextEdit类似功能的控件——QPlainTextEdit,该控件只能表示纯文本,而QTextEdit不仅能表示纯文本,还能表示 html 和 markdown。用法上基本一致。
TextEdit重点在于信号。编写内容时,textChanged 和 cursorPositionChanged 会触发。鼠标选中一段文本时,cursorPositionChanged,selectionChanged,copyAvailable 会触发。按下 ctrl + z 撤销操作时,textChanged,undoAvailable,redoAvailable,cursorPositionChanged 会触发。按下 ctrl + y,textChanged,undoAvailable,redoAvailable,cursorPositionChanged 会触发。
信号中 undo 是指如果用户进行了可以撤销的操作(如文本输入、删除等),该信号会被发出,并且参数 available
会设置为 true
,表示此时可以执行撤销操作;相反,如果没有可撤销的操作,available
将为 false
。undo对应的快捷键是 ctrl + z。
信号中 redo 是指重做操作。当存在已被撤销的操作可以重新执行时,此信号将被发出,并且参数 available
会是 true
;若无可重做的操作,则 available
为 false
。redo对应的快捷键是 ctrl + y。
selectionChanged 跟 copyAvailable 不同的是当范围选中文本时,selectionChanged会一直触发,copyAvailable选中文本时只会触发一次,取消选中时也触发一次,此时bool参数为false。
void Widget::on_textEdit_textChanged()
{
// toPlainText()获取文本,跟很多控件的text()一样
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();
// cursor.position()表示光标的位置,即1,2,3...
qDebug() << "[cursorPositionChanged] " << cursor.position();
}
void Widget::on_textEdit_undoAvailable(bool b)
{
qDebug() << "[undoAvailable] " << b;
}
void Widget::on_textEdit_redoAvailable(bool b)
{
qDebug() << "[redoAvailable] " << b;
}
void Widget::on_textEdit_copyAvailable(bool b)
{
qDebug() << "[copyAvailable] " << b;
}
4,Combo Box
QComboBox 表示下拉框。核心属性、核心方法、核心信号如下:
ui->comboBox->addItem("巨⽆霸");
ui->comboBox->addItem("⻨辣鸡腿堡");
ui->comboBox_2->addItem("薯条");
ui->comboBox_2->addItem("⻨辣鸡翅");
ui->comboBox_3->addItem("可乐");
ui->comboBox_3->addItem("雪碧");
void Widget::on_pushButton_clicked()
{
qDebug() << "汉堡选择: " << ui->comboBox->currentText();
qDebug() << "⼩⻝选择: " << ui->comboBox_2->currentText();
qDebug() << "饮料选择: " << ui->comboBox_3->currentText();
}
很多时候下拉框的选项并非是固定的,而是通过读取文件或读取网络获取到的。从文件中获取数据时,可以使用 C++ 标准库的 std::fstream,也可以使用 Qt 所提供的QFile,它同样实现读写文件的功能。
// 打开文件
std::ifstream file("E:/text.txt");
if (!file.is_open()) {
qDebug() << "文件打开失败";
return;
}
// getline按行来读取文本,从文件中取到的每一行内容设置到下拉框中
std::string line;
while (std::getline(file, line)) {
// QString::fromStdString把std::string转成QString
ui->comboBox->addItem(QString::fromStdString(line));
}
file.close();
5,Spin Box
QSpinBox 或 QDoubleSpinBox 表示 "微调框",它是带有按钮的输入框,可以用来输入整数或浮点数。通过点击按钮来修改数值大小。由于 SpinBox 和 QDoubleSpinBox 用法基本相同,所以这里就只介绍 SpinBox 的使用了。
ui->comboBox->addItem("巨无霸");
ui->comboBox->addItem("⻨辣鸡腿堡");
ui->spinBox->setValue(1);
ui->spinBox->setRange(1, 5); // 设置微调框数值范围
6,Date Edit和Time Edit
QDateEdit 是日期的微调框。
QTimeEdit 是时间的微调框。
QDateTimeEdit 是时间日期的微调框。
这几个控件用法非常相似,这里以 QDateTimeEdit 为例进行介绍。其核心属性如下:
// 获取到两个时间框的时间⽇期
QDateTime timeOld = ui->dateTimeEdit->dateTime();
QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
// 计算⽇期差值
// daysTo函数可以计算两个⽇期差的天数。该函数存在bug,因为这里没有考虑小时,是直接拿天数相减
// secsTo函数可以计算两个时间差的秒数
// int days = timeOld.daysTo(timeNew); bug代码
int seconds = timeOld.secsTo(timeNew);
int days = (seconds / 3600) / 24; // 通过秒数计算天数
int hours = (seconds / 3600) % 24;
// QString::number把整数转成QString
QString text = QString::number(days) + QString(" 天 ") + QString::number(hours)
7,Dial
QDial 表示一个旋钮,如下图。
ui->dial->setMinimum(0); // 设置旋钮对应的最小数值
ui->dial->setMaximum(100); // 设置旋钮对应的最大数值
ui->dial->setWrapping(true); // 设置可以循环旋转
ui->dial->setNotchesVisible(true); // 设置刻度线可见
ui->dial->setValue(100); // 设置初始值为100
// 通过旋钮调整窗口的透明度
void Widget::on_dial_valueChanged(int value)
{
qDebug() << value;
// 注意:不透明度是个小数。0完全不透明;1完全透明
this->setWindowOpacity((double)value / 100);
}
8,Slider
QSlider 表示一个滑动条,它分为水平滑动条和垂直滑动条。这里要说明下,QSlider 和 QDial 都是继承自 QAbstractSlider,因此用法上基本相同。
ui->verticalSlider->setMinimum(800);
ui->verticalSlider->setMaximum(1000);
ui->verticalSlider->setValue(800);
ui->verticalSlider->setInvertedAppearance(true); // 翻转朝向, 默认滑块从下向上增⻓, 改成从上往下增⻓
// 使用快捷键,需要用到QShortcut类
// 这里用快捷键‘s’进行减少,‘w’进行增加
QShortcut* shortcut1 = new QShortcut(this);
shortcut1->setKey(QKeySequence("s"));
connect(shortcut1, &QShortcut::activated, this, &Widget::subValue);
QShortcut* shortcut2 = new QShortcut(this);
shortcut2->setKey(QKeySequence("w"));
connect(shortcut2, &QShortcut::activated, this, &Widget::addValue);
// 使用滑动条增加或减小窗口大小,并使用快捷键功能
void Widget::on_verticalSlider_valueChanged(int value)
{
QRect rect = this->geometry();
this->setGeometry(rect.x(), rect.y(), rect.width(), value);
qDebug() << value;
}
void Widget::subValue()
{
int value = ui->verticalSlider->value();
if (value <= ui->verticalSlider->minimum()) {
return;
}
ui->verticalSlider->setValue(value - 20);
}
void Widget::addValue()
{
int value = ui->verticalSlider->value();
if (value >= ui->verticalSlider->maximum()) {
return;
}
ui->verticalSlider->setValue(value + 20);
}