【qt】常用控件|qlineedit|qtextedit|qcombox|qspinbox|qdatetimeedit|计算日期差值|点餐份数|读取文件下拉框(万字详解版)_qtimeedit添加下拉菜单-爱代码爱编程
目录
QLineEdit
表示单行输入,输入一段文本,但是不能换行;
用于接收用户输入的文本信息。
基本功能和用法
属性 | 作用 |
text | 输入框的文本 |
inputMask | 输入内容格式的约束 |
echoMode | 显示方式: QLineEdit::Normal:默认值,文本框显示输入的文本; QLineEdit::password:密码模式,输入的字符会被隐藏; 通常用 * 或 = 替代隐藏; QtLineEdit::Noecho:该模式,文本框输入后不会显示输入字符 |
placeHolderText | 当输入框为空时,显示提示信息 |
clearButtonEnabled | 是否自动显示出"清除按钮",一键清除文本框的内容 |
核心信号
属性 | 说明 |
void editingFinished() | 当按回车键时发出此信号。 |
void returnPressed() | 当按下回车键时发出此信号 如果设置了验证器,必须要验证通过,才能触发 |
void selectionChanged() | 当选中的文本改变时,发出此信号。 |
void textChanged(const QString &text) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。 代码对文本的修改能够触发这个信号 |
void textEdited(const QString &text)) | 当QLineEdit中的文本改变时,发出此信号,text是新的文本。 代码对文本的修改不能触发这个信号 |
void cursorPositionChanged(int old,int new) | 当鼠标移动时发出此信号,old为先前的位置,new为新位置 |
核心信号
信号 | 说明 |
textChanged() | 文本内容改变时触发 |
selectionChanged() | 选中范围改变时触发 |
cursorPositionChanged() | 光标移动时触发 |
undoAvailable(bool) | 可以进行undo操作时触发 |
redoAvailable(bool) | 可以进行redo操作时触发 |
copyAvailable(bool) | 文本被选中/取消选中时触发 |
示例
按照下图在Qt Designer中创建,依作用命名
对LineEdit输入框为空时,显示输入提示信息
//当输入框为空时,显示提示信息
ui->lineEdit_name->setPlaceholderText("请输入名字");
ui->lineEdit_password->setPlaceholderText("请输入密码");
// ui->lineEdit_phone->setPlaceholderText("请输入电话");
密码会显示出现,设置隐藏密码文本框
//输入密码,遮蔽隐藏
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
添加一键清除按钮,快捷所需操作,
同时添加对密码文本框限制输入格式,按照电话344格式设置;
//清除按钮
ui->lineEdit_name->setClearButtonEnabled(true);
ui->lineEdit_password->setClearButtonEnabled(true);
ui->lineEdit_phone->setClearButtonEnabled(true);
//限制输入格式
ui->lineEdit_phone->setInputMask("000-0000-0000");
槽函数
对PushButton按钮对象添加槽函数,在输入各种信息完毕后,打印text;
void Widget::on_pushButton_clicked()
{
//按钮槽函数,显示打印QLineEdit->text
QString gender = ui->radioButton_male->isChecked()?"男":"女";
qDebug()<<"姓名: "<<ui->lineEdit_name->text()
<<"密码: "<<ui->lineEdit_password->text()
<<"性别: "<<gender
<<"电话是: "<<ui->lineEdit_phone->text();
// if(ui->radioButton_male->isChecked())
// {
// qDebug()<<"性别: "<<ui->radioButton_male->text();
// }
// else
// {
// qDebug()<<"性别: "<<ui->radioButton_female->text();
// }
}
优化:使用正则表达式
要求输入框输入一个合法的电话号码(1开头,11位,全部为数字),如果验证不通过,按钮无法点击
验证器
验证器(Validator)是一种用于确保用户输入数据符合特定格式或规则的组件;
例如:
一个整数验证器可以确保用户输入的是有效的整数。Qt提供了几种内置的验证器,
比如QIntValidator、QDoubleValidator、QRegExpValidator(正则表达式验证器)等,它们可以用于不同的数据类型和验证需求。
1.创建一个文本框和按钮:
给输入框添加验证器,将按钮默认设置 setEnabled(fasle)禁用状态;
2.添加验证器:
QRegExp:创建一个正则表达式对象, "^1//d{10}$";
使用QRegExpValidator 创建一个验证器对象:
通过传递一个正则表达式对象给 QRegExpValidator 的构造函数来创建一个验证器
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//将按钮默认设置是为false
ui->pushButton->setEnabled(false);
QRegExp regExp("^1\\d{10}$");
ui->lineEdit->setValidator(new QRegExpValidator(regExp));
//也可以用 匿名对象方式一键式创建validator
// ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("^1//d{10}$")));
}
槽函数
给QLineEdit添加信号与槽函数,当文本改变时,触发该信号
通过 validate ⽅法验证⽂本是否符合要求,
第⼀个参数填写的是要验证的字符串,参数要求是QString,
第二个参数是 当字符串不匹配时,返回不匹配字符的位置
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
//当文本改变时,触发此信号
//注 此信号:代码对文本改变不会触发该信号
//arg1 参数 是当前输入框的内容
QString text = arg1;
//表示位置
int pos = 0;
//获取文本框的验证器,检查里面的文本是否符合要求 返回值是一个枚举 QValidator::Acceptable 表示通过 QValidator::Invalid 表示不通过
// ui->lineEdit->validator()->validate(text,pos);
if(ui->lineEdit->validator()->validate(text,pos) == QValidator::Acceptable)
{
//验证通过,将按钮设为启动
ui->pushButton->setEnabled(true);
}
else
{
ui->pushButton->setEnabled(false);
}
}
验证密码
输入两次密码,检查是否一致;
三种情况: 密码为空,密码一致,密码不同
为两个单行输入框添加各自的槽函数,当文本改变时就自动触发信号让对应槽函数进行检查
void Widget::on_lineEdit_textEdited(const QString &arg1)
{
//获取两个文本框的text
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 &arg1)
{
//获取两个文本框的text
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("密码不相同");
}
}
切换显示密码
输入密码,不仅编译器要检查是否一致,用户也要显示查看是否输入错误或查看输入的密码;
创建一个checkBox复选框,和单行输入框
给checkBox添加 toggled槽函数;
注意:clicked(bool)现阶段差别不大,bool跟toggled的相似
QTextEdit
是一个多行输入框,支持富文本和markdown编辑器,
能够在内容超出编辑框时自动提供滚动条
核心属性
属性 | 作用 |
markdown | 输入框内的内容。支持markdown格式。能够自动的对markdown文本进行 渲染成html |
html | 输入框内的内容。支持大部分html标签。 |
placeHolderText | 输入框为空时提示的内容 |
readonly | 是否只读 |
undoRedoEnable | 是否开启undo/redo功能
|
autoFormatting | 开启自动格式化 |
tabstopWidth | 按下缩进占多少空间 |
overwriteMode | 是否开启覆盖写模式 |
acceptRichText | 是否接收富文本内容 |
verticalScrollBarPolicy | 垂直方向滚动条的出现策略 Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条。这是默认值。 Qt::ScrollBarAlwaysOff:总是关闭滚动条。 Qt::ScrollBarAlwaysOn:总是显示滚动条。 |
horizontalScrollBarPolicy | 水平方向滚动条的出现策略 Qt::ScrollBarAsNeeded:根据内容自动决定是否需要滚动条。这是默认值。 Qt::ScrollBarAlwaysOff:总是关闭滚动条。 Qt::ScrollBarAlwaysOn:总是显示滚动条。 |
示例
创建一个多行输入框,和label。当输入框内容改变时,label同步跟新
添加TextEdit的槽函数,当文本改变时触发textChanged信号;
注:这里的获取文本不是平常的text(),而是toPlainText();
void Widget::on_textEdit_textChanged()
{
//当文本改变时,触发该函数,改变label
//label->setText(const QString&)
const QString& s = ui->textEdit->toPlainText();
qDebug()<<s;
ui->label->setText(s);
}
验证信号
void Widget::on_textEdit_copyAvailable(bool b)
{
//文本被选中/取消选中时触发
qDebug()<<"[copyAvailable]: "<<b;
}
void Widget::on_textEdit_cursorPositionChanged()
{
//光标移动时触发
//qDebug()<<"[cursorPositionChanged]";
// 获取鼠标光标的位置
qDebug()<<"[cursorPositionChanged]: "<< ui->textEdit->textCursor().position();
// const QTextCursor& cursor = ui->textEdit->textCursor();
// qDebug()<<"[cursorPositionChanged]: "<<cursor.position();
}
void Widget::on_textEdit_redoAvailable(bool b)
{
//可以进⾏redo操作时触发
//当撤回操作时,触发 为true
qDebug()<<"[redoAvailable]: "<<b;
}
void Widget::on_textEdit_selectionChanged()
{
//选中范围改变时触发
const QTextCursor& cursor = ui->textEdit->textCursor();
qDebug()<<"[selectionChanged]: "<<cursor.selectedText();
}
void Widget::on_textEdit_textChanged()
{
//⽂本内容改变时触发
qDebug()<<"[textChanged]: "<<ui->textEdit->toPlainText();
}
void Widget::on_textEdit_undoAvailable(bool b)
{
qDebug()<<"[undoAvailable]: "<<b;
}
QComBox
是一个组合框部件,从预定义的选项列表中选择一个选项。通常以下拉列表框的形式呈现,用户可以点击下拉箭头展开选项列表,并从中选择一个选项。
主要特点和用法:
- 选项列表:QComboBox 可以包含多个选项,这些选项可以是文本、图标或者自定义的 QWidget。
- 样式:可以通过样式表(StyleSheet)来自定义 QComboBox 的外观,如更改背景颜色、字体样式等。
核心属性
属性 | 说明 |
currentText | 当前选中的文本 |
currentIndex | 当前选中的条目下标.从0开始计算,如果当前没有条目被选中 值为-1 |
editable | 是否允许修改,设为true时,QComboBox和QLineEdit很像,同样也可以设置validator0 |
iconSize | 下拉框图标的大小 |
maxCount | 最多允许有多少个条目 |
核心方法
方法 | 说明 |
addItem(const QString&) | 增加一个条目 |
currentIndex() | 获取当前条目的下标,从0开始计算,如果当前没有条目被选中,值为-1 |
currentText() | 获取当前条目的文本内容 |
示例
创建下拉框,通过按钮输出下拉框选择的条目内容
给下拉框增加内容,使用addItem()
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("双人座");
}
给PushButton添加clicked槽函数,输出下拉框选择的条目text
void Widget::on_pushButton_clicked()
{
//对应鼠标点击槽函数
qDebug()<<ui->comboBox->currentText()
<<ui->comboBox_2->currentText()
<<ui->comboBox_3->currentText() ;
}
识取文件
创建一个.txt文件,在里面输入我们想要的下拉框内容,通过打开文件读取内容输入到ComBox下拉框中
{
ui->setupUi(this);
//打开文件 //文件路径
std::ifstream file("D:\\gitee\\qt\\QComBox2\\QComBox.txt");
std::string line;
//循环获取文件内容 以行获取
while(std::getline(file,line))
{
//QString提供的方法 将String转换成QString
ui->comboBox->addItem(QString::fromStdString(line));
}
//关闭文件
file.close();
}
QSpinBox
用于输入整数值的部件,可以通过键盘或者上下箭头按钮增加或减少数字,设置步进值,每次增加或减少的数值量,它常用于需要用户输入整数值的场景
示例
模拟写一个麦当劳点餐,可以调整食品份数
初始化下拉框,微调框
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->spinBox_1->setValue(1); //设置初始值
ui->spinBox_1->setRange(1,5); //设置范围
ui->spinBox_2->setValue(1); //设置初始值
ui->spinBox_2->setRange(1,5); //设置范围
ui->spinBox_3->setValue(1); //设置初始值
ui->spinBox_3->setRange(1,5); //设置范围
}
给提交按钮,添加槽函数,输出下拉框和微调框的当前内容
void Widget::on_pushButton_clicked()
{
qDebug()<<ui->comboBox->currentText()<<":"<<ui->spinBox_1->value()
<<ui->comboBox_2->currentText()<<":"<<ui->spinBox_2->value()
<<ui->comboBox_3->currentText()<<":"<<ui->spinBox_3->value();
}
QDateEdit&QTimeEdit
QDateEdit是日期微调框
QTimeEdit是时间微调框
二者合一:QDateTimeEdit是时间日期的微调框
这三个控件用法相似,以QDateTimeEdit为主介绍
示例
实现日期计算器
创建两个QDateTimeEdit,计算两个日期的差值,天数,秒数
void Widget::on_pushButton_clicked()
{
//获取两个时间日期
QDateTime timeOld = ui->dateTimeEdit->dateTime();
QDateTime timeNew = ui->dateTimeEdit_2->dateTime();
//计算差值
// int days = timeOld.daysTo(timeNew);
// int hours = (timeOld.secsTo(timeNew)/3600%24);
// QString text = QString::number(days)+ QString("天,")+ QString::number(hours)+QString("时.");
// ui->label->setText(text);
// 计算日期的差值.
// int days = timeOld.daysTo(timeNew); //daysTo 有bug,慎用 用秒转成需要的数据即可
int seconds = timeOld.secsTo(timeNew);
//要把秒数换算成小时.
int hours = (seconds / 3600) % 24;
int days = (seconds / 3600) / 24;
// 把计算结果放到 label 中
QString text = QString("有") + QString::number(days) +QString("天") + QString::number(hours) +QString("时") ;
ui->label->setText(text);
}
QDial
表示一个旋钮
示例
通过这个按钮来调节窗口不透明度(0~1)
初始化数值
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置可以循环旋转
ui->dial->setWrapping(true);
//设置刻度线可见
ui->dial->setNotchesVisible(true);
//设置最大值为
ui->dial->setMaximum(100);
//设置最小值为
ui->dial->setMinimum(0);
//设置初始值为
ui->dial->setValue(100);
}
添加dial的槽函数,通过value值的改变,触发信号
void Widget::on_dial_valueChanged(int value)
{
// QString::number(value)将整数value转换为字符串
ui->label->setText(QString("当前不透明度为:")+ QString::number(value));
// 设置窗口的不透明度
// 将value除以100,得到0到1之间的值,表示不透明度(0完全透明,1完全不透明)
this->setWindowOpacity((double)value/100);
}