文章目录
- 1.QLineEdit
- 1.1 常用属性
- 1.2 常用信号
- 1.3 例子1,录入用户信息
- 1.4 例子2,正则验证手机号
- 1.5 例子3,验证输入的密码
- 1.6 例子4,显示密码
- 2. QTextEdit
- 2.1 常用属性
- 2.2 常用信号
- 2.3 例子1,获取输入框的内容
- 2.4 例子2,使用各种信号
- 3. QComboBox
- 2.1 常用属性和方法
- 2.2 常用信号
- 2.3 例子1,点餐
- 2.4 例子2,从文件读取内容
- 4. QSpinBox
- 4.1 常用属性
- 4.2 常用信号
- 4.3 例子1,饮料个数
- 5. QDateTimeEdit
- 4.1 常用属性
- 4.2 常用信号
- 4.3 例子1,计算年龄
- 6. QDial
- 6.1 常用属性
- 6.2 常用信号
- 6.3 例子1,调整窗口不透明度
- 7. QSlider
- 7.1 常用属性
- 7.2 常用信号
- 7.3 例子1,调整窗口大小
- 7.3 例子2,快捷键调整
1.QLineEdit
QLineEdit
表示单行输入框
1.1 常用属性
属性 | 说明 |
---|---|
text | 输入框中的文本内容,可用于获取或设置当前显示的文本。 |
inputMask | 对输入内容的格式进行约束,规定用户只能按照特定的格式输入文本,例如限制输入日期、电话号码等格式。 |
maxLength | 输入框允许输入的最大长度,当输入的文本达到该长度后,用户将无法继续输入更多字符。 |
frame | 控制是否为输入框添加边框,设置为 true 显示边框,false 则不显示。 |
echoMode | 控制输入框中文本的显示方式,有以下几种模式: - QLineEdit::Normal :默认模式,输入框会正常显示输入的文本。 - QLineEdit::Password :输入的字符会被隐藏,通常用星号(* )或等号(= )代替,常用于密码输入场景。 - QLineEdit::NoEcho :输入框不会显示任何输入的字符。 |
cursorPosition | 表示光标在输入框中的位置,位置从 0 开始计数,可用于获取或设置光标的位置。 |
alignment | 设置输入框内文字的对齐方式,可同时设置水平和垂直方向的对齐,例如左对齐、右对齐、居中对齐等。 |
dragEnabled | 控制是否允许对输入框中的文本进行拖拽操作,设置为 true 允许,false 则禁止。 |
readOnly | 控制输入框是否为只读状态,设置为 true 时,输入框内容不可修改,用户只能查看;false 时可正常编辑。 |
placeHolderText | 当输入框内容为空时,显示的提示信息,用于引导用户输入相应内容。 |
clearButtonEnabled | 控制输入框是否会自动显示 “清除按钮”,设置为 true 显示,点击该按钮可清空输入框内容;false 则不显示。 |
1.2 常用信号
信号 | 说明 |
---|---|
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 是新的文本内容。但代码对文本的修改不能触发这个信号,主要用于区分用户手动编辑和代码修改文本的情况。 |
1.3 例子1,录入用户信息
在Qt Designer
中设置基本框架
widget.cpp
核心代码如下
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置name
ui->lineEdit_name->setPlaceholderText("请输入姓名");
ui->lineEdit_name->setClearButtonEnabled(true);
// 设置phone
ui->lineEdit_phone->setPlaceholderText("请输入电话");
ui->lineEdit_phone->setClearButtonEnabled(true);
ui->lineEdit_phone->setInputMask("000-0000-0000"); // 0表示数字, 也可以是其它数字
// 设置password
ui->lineEdit_password->setPlaceholderText("请输入密码");
ui->lineEdit_password->setClearButtonEnabled(true);
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
}
void Widget::on_pushButton_clicked()
{
QString gender = ui->radioButton_male->isChecked() ? "男" : "女";
qDebug() << ui->lineEdit_name->text() << ' '
<< gender << ' '
<< ui->lineEdit_phone->text() << ' '
<< ui->lineEdit_password->text();
}
点击提交后,将结果打印到控制台上
1.4 例子2,正则验证手机号
const QValidator *QLineEdit::validator() const
是 QLineEdit
类中的一个成员函数:
该函数的主要功能是获取当前 QLineEdit
控件所使用的验证器对象的指针
QValidator::State QValidator::validate(QString &input, int &pos) const
是 QValidator
类中的一个纯虚函数,QValidator
是 Qt 中用于验证用户输入的基类,该函数用于对输入的字符串进行验证,并根据验证结果返回相应的状态。:
- 返回值
QValidator::State
是一个枚举类型,用于表示验证的结果,有以下三种取值:QValidator::Invalid
:表示输入无效,不符合验证规则。QValidator::Intermediate
:表示输入处于中间状态,部分符合验证规则,但还不完整或需要进一步输入才能确定是否有效。QValidator::Acceptable
:表示输入完全有效,符合验证规则。
- 参数:
QString &input
:这是一个引用类型的参数,代表需要进行验证的输入字符串。在验证过程中,函数可能会修改这个字符串,使其符合验证规则。int &pos
:同样是引用类型的参数,代表输入字符串中光标的位置。在验证过程中,函数可能会调整光标的位置。
设置一个输入框,使用正则表达式验证该手机号。在Qt Designer
中设置基本框架
#include "widget.h"
#include "ui_widget.h"
#include <QRegExpValidator>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->lineEdit->setClearButtonEnabled(true);
ui->lineEdit->setPlaceholderText("请输入手机号");
// 创建一个正则表达式对象
QRegExp reg("^1(3[0-9]|5[0-3,5-9]|7[1-3,5-8]|8[0-9])\\d{8}$");
// 给lineEdit注册一个validator
ui->lineEdit->setValidator(new QRegExpValidator(reg));
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_lineEdit_textChanged(const QString &text)
{
// 获取验证器
const QValidator* validator = ui->lineEdit->validator();
QString non_const_text = text; // validate的第一个参数要求是非const的
int pos = 0;
// 判断验证是否通过
if(validator->validate(non_const_text, pos) == QValidator::Acceptable) {
ui->pushButton->setEnabled(true);
} else {
ui->pushButton->setEnabled(false);
}
}
不能键入不正确的手机号。何时为一个合法的手机号,何时按钮可用
1.5 例子3,验证输入的密码
在Qt Designer
中设置基本框架
设置槽函数
void Widget::check()
{
const QString s1 = ui->lineEdit->text();
const QString s2 = ui->lineEdit_2->text();
if(s1.isEmpty() || s2.isEmpty()) {
const QString set_text = (s2.isEmpty() ? "确认密码为空" : "密码为空");
ui->label->setText(set_text);
} else if(s1 != s2) {
ui->label->setText("两次输入的密码不一致");
} else {
ui->label->setText("密码匹配成功");
}
}
void Widget::on_lineEdit_textChanged(const QString &arg1)
{
(void) arg1;
check();
}
void Widget::on_lineEdit_2_textChanged(const QString &arg1)
{
(void) arg1;
check();
}
1.6 例子4,显示密码
在Qt Designer
中设置基本框架
设置槽函数
void Widget::on_checkBox_stateChanged(int state)
{
if(state == Qt::Checked) {
ui->lineEdit->setEchoMode(QLineEdit::Normal);
} else {
ui->lineEdit->setEchoMode(QLineEdit::Password);
}
}
2. QTextEdit
QTextEdit
表示多行输入框
2.1 常用属性
属性 | 说明 |
---|---|
plainText | 当前文本内容(以纯文本形式)。获取当前文本内容(纯文本格式)使用的是toPlainText() |
markdown | 输入框内持有的内容,支持 Markdown 格式,能够自动将 Markdown 文本渲染成 HTML。toMarkdown() 获取内容 |
html | 输入框内持有的内容,可以支持大部分 HTML 标签,包括 img 和 table 等。toHtml() 获取内容 |
placeHolderText | 输入框为空时提示的内容 |
readOnly | 控制输入框是否为只读状态 |
undoRedoEnable | 控制是否开启 Undo/Redo 功能。按下 Ctrl + Z 触发 Undo,按下 Ctrl + Y 触发 Redo |
autoFormating | 控制是否开启自动格式化 |
tabstopWidth | 按下 Tab 键时缩进所占的空间大小 |
overwriteMode | 控制是否开启覆盖写模式 |
acceptRichText | 控制是否接收富文本内容 |
verticalScrollBarPolicy | 垂直方向滚动条的出现策略: - Qt::ScrollBarAsNeeded :根据内容自动决定是否需要滚动条(默认值) - Qt::ScrollBarAlwaysOff :总是关闭滚动条 - Qt::ScrollBarAlwaysOn :总是显示滚动条 |
horizontalScrollBarPolicy | 水平方向滚动条的出现策略: - Qt::ScrollBarAsNeeded :根据内容自动决定是否需要滚动条(默认值) - Qt::ScrollBarAlwaysOff :总是关闭滚动条 - Qt::ScrollBarAlwaysOn :总是显示滚动条 |
2.2 常用信号
信号 | 说明 |
---|---|
textChanged() | 当 QTextEdit 中的文本内容发生改变时触发该信号,可用于实时监测文本内容的变化,例如在用户输入或删除文本时做出响应。 |
selectionChanged() | 当文本的选中范围发生改变时触发此信号,比如用户选中新的文本区域或者取消已选的文本区域,可利用该信号实现与文本选择相关的功能。 |
cursorPositionChanged() | 光标在 QTextEdit 中移动时触发该信号,可用于实现一些依赖光标位置的操作,如显示光标所在的行号和列号等。 |
undoAvailable(bool) | 当可以进行 Undo(撤销)操作时触发此信号,参数 bool 表示是否可以进行撤销操作,true 表示可以,false 表示不可以,可据此更新撤销操作相关的界面元素状态。 |
redoAvailable(bool) | 当可以进行 Redo(重做)操作时触发此信号,参数 bool 表示是否可以进行重做操作,true 表示可以,false 表示不可以,可用于更新重做操作相关的界面元素状态。 |
copyAvailable(bool) | 文本被选中或取消选中时触发该信号,参数 bool 表示是否有文本被选中,true 表示有文本被选中,此时可以进行复制操作,false 表示无文本被选中,可用于控制复制功能相关的界面元素的可用性。 |
2.3 例子1,获取输入框的内容
在Qt Designer
中设置基本框架,一个QLabel和一个QTextEdit
给QTextEdit设置一个槽函数
void Widget::on_textEdit_textChanged()
{
QString text = ui->textEdit->toPlainText();
ui->label->setTextFormat(Qt::MarkdownText);
ui->label->setText(text);
}
2.4 例子2,使用各种信号
在在Qt Designer
中拖入一个QTextEdit。设置槽函数
void Widget::on_textEdit_selectionChanged()
{
// 得到当前可见的光标
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();
}
void Widget::on_textEdit_undoAvailable(bool b)
{
qDebug() << "undoAvailable: "
<< b;
}
void Widget::on_textEdit_redoAvailable(bool b)
{
qDebug() << "redoAvailable: "
<< b;
}
当输入内容时:undoAvailable
为true
,点击撤销后,undoAvailable
为false
,redoAvailable
为true
,点击反撤销后,redoAvailable
为false
,undoAvailable
为true
。
void Widget::on_textEdit_copyAvailable(bool b)
{
qDebug() << "copyAvailable: "
<< b;
}
当选中内容时,copyAvailable
为true
。
3. QComboBox
QComboBox
表示下拉框
2.1 常用属性和方法
属性
属性 | 说明 |
---|---|
currentText | 表示当前在 QComboBox 中被选中的文本内容。通过这个属性可以获取用户当前选择的具体文本信息。 |
currentIndex | 当前被选中条目的下标,下标从 0 开始计数。若当前没有任何条目被选中,该属性的值为 -1。可用于定位当前选中项在下拉列表中的位置。 |
editable | 控制 QComboBox 是否允许用户对显示的文本进行修改。当设置为 true 时,QComboBox 的行为与 QLineEdit 类似,用户可以直接在输入框中编辑文本,同时也可以为其设置验证器(validator )来限制输入内容的格式。 |
iconSize | 用于设置下拉框图标(通常是小三角图标)的大小。可以根据界面设计需求调整该图标的尺寸。 |
maxCount | 规定了 QComboBox 下拉列表中最多允许存在的条目数量。当添加的条目数量达到该上限时,将无法再添加更多条目。 |
方法
方法 | 说明 |
---|---|
addItem(const QString&) | 向 QComboBox 的下拉列表中添加一个新的条目,参数为要添加条目的文本内容。 |
currentIndex() | 获取当前被选中条目的下标,下标从 0 开始计数。如果当前没有任何条目被选中,该方法返回 -1。 |
currentText() | 获取当前被选中条目的文本内容。 |
2.2 常用信号
信号 | 说明 |
---|---|
activated(int) activated(const QString &text) | 当用户选择了一个选项时发出。这里的 “选择” 指用户点开下拉框,并且鼠标划过某个选项,但此时用户还未确认做出选择。activated(int) 信号会传递选中选项的索引(从 0 开始计数),activated(const QString &text) 信号会传递选中选项的文本内容。 |
currentIndexChanged(int) currentIndexChanged(const QString &text) | 当前选项改变时发出。意味着用户已经明确地选择了一个选项,无论是通过用户手动操作(如鼠标点击、键盘选择等),还是通过程序代码修改当前选项,都会触发这个信号。currentIndexChanged(int) 传递改变后选项的索引,currentIndexChanged(const QString &text) 传递改变后选项的文本内容。 |
editTextChanged(const QString &text) | 当编辑框中的文本改变时发出,该信号仅在 editable 属性为 true 时有效。也就是当 QComboBox 处于可编辑状态,用户对输入框内的文本进行编辑修改时,会触发此信号,信号传递当前编辑框内的文本内容。 |
2.3 例子1,点餐
在Qt Designer
中设置基本框架
既可以在代码中设置,也可以在Qt Designer
中设置下拉框中的条目。右键->编辑项目->编辑组合框->点击+号,添加各种条目
添加一个按钮,给按钮添加槽函数
void Widget::on_pushButton_clicked()
{
qDebug() << ui->comboBox->currentText() << ' '
<< ui->comboBox_2->currentText() << ' '
<< ui->comboBox_3->currentText() << ' ';
}
2.4 例子2,从文件读取内容
当前目录下有一个food.txt
在Qt Designer
中设置基本框架
widget.cpp
代码如下
#include "widget.h"
#include "ui_widget.h"
#include <fstream>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
std::string content;
if(readFile("D:/bit/QT/QTPro/25_1_30QComboBox_2/food.txt", &content) == true) {
QString str = QString::fromStdString(content); // 转成QString
QStringList list = str.split("\r\n"); // 切割, 转成QStringList
list.removeLast(); // 删除最后一个空元素
ui->comboBox->addItems(list);
}
}
Widget::~Widget()
{
delete ui;
}
bool Widget::readFile(std::string path, std::string *outStr)
{
std::ifstream file(path, std::ios::binary);
if(!file) {
qDebug() << "Open file error!";
printf("why: %s\n", strerror(errno));
return false;
}
file.seekg(0, std::ios::end);
int fileSize = file.tellg(); // 得到文件的大小
file.seekg(0);
outStr->resize(fileSize);
file.read((char*)outStr->c_str(), fileSize); // 读取文件内容到outStr中
file.close();
return true;
}
4. QSpinBox
QSpinBox
或者QDoubleSpinBox
表示微调框
4.1 常用属性
属性 | 说明 |
---|---|
value | 存储的数值,代表 QSpinBox 当前显示的数值。 |
singleStep | 每次调整的 “步长”,即按下一次按钮(上下箭头等)数据变化的量。 |
displayInteger | 数字的进制,例如设置为 10 则按照 10 进制表示,设置为 2 则为 2 进制表示。 |
minimum | 允许输入的最小值,输入的值不能小于该值。 |
maximum | 允许输入的最大值,输入的值不能大于该值。可以使用setRange(int min, int max) 同时设置最大值和最小值 |
suffix | 后缀,会显示在数值的后面,可用于表示单位等信息。 |
prefix | 前缀,会显示在数值的前面,可用于添加特定标识。 |
wrapping | 是否允许换行,若设置为 true ,当达到最大值时再增加会回到最小值,达到最小值时再减小会回到最大值。 |
frame | 是否带边框,设置为 true 显示边框,false 则不显示。 |
alignment | 文字对齐方式,可设置水平和垂直方向的对齐,例如左对齐、右对齐、居中对齐等。 |
readOnly | 是否允许修改,设置为 true 时,用户无法直接修改输入框内的数值,只能通过按钮进行调整;false 时可正常编辑。 |
buttonSymbol | 按钮上的图标样式,有以下几种取值: - UpDownArrows :上下箭头形式。 - PlusMinus :加减号形式。 - NoButtons :没有按钮。 |
accelerated | 按下按钮时是否为快速调整模式,设置为 true 时,长按按钮数值会快速变化。 |
correctionMode | 输入有误时的修正方式,有以下两种取值: - QAbstractSpinBox::CorrectToPreviousValue :如果用户输入了一个无效的值,SpinBox 会恢复为上一个有效值。 - QAbstractSpinBox::CorrectToNearestValue :如果用户输入了一个无效的值,SpinBox 会恢复为最接近的有效值。 |
keyboardTrack | 是否开启键盘跟踪,设置为 true 时,每次在输入框输入一个数字,都会触发一次 valueChanged() 和 textChanged() 信号;设置为 false 时,只有在最终按下 Enter 或者输入框失去焦点,才会触发这两个信号。 |
4.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
textChanged(QString) | 文本框内容发生任何变化时触发(无论输入是否合法或最终值是否改变)。 | QString 类型,代表当前微调框显示的完整文本,包含前缀、数值和后缀。 |
valueChanged(int) | 数值实际发生改变时触发(仅当输入内容被解析为有效整数且值变化时触发)。 | int 类型,表示当前微调框所代表的数值,不包含前缀和后缀信息。 |
4.3 例子1,饮料个数
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
ui->spinBox->setRange(1, 100);
ui->spinBox->setSuffix("瓶");
ui->spinBox->setWrapping(true);
ui->spinBox->setAccelerated(true);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_spinBox_textChanged(const QString &arg1)
{
qDebug() << "textChanged: " << arg1;
}
5. QDateTimeEdit
使用 QDateTimeEdit
作为时间日期的微调框。使用 QDateEdit
作为日期的微调框。使用 QTimeEdit
作为时间的微调框
4.1 常用属性
属性 | 说明 |
---|---|
dateTime | 时间日期的值,格式形如 2000/1/1 0:00:00 ,可用于获取或设置控件中显示的具体日期和时间。 |
date | 单纯日期的值,格式形如 2001/1/1 ,用于获取或设置控件中显示的日期部分。 |
time | 单纯时间的值,格式形如 0:00:00 ,用于获取或设置控件中显示的时间部分。 |
displayFormat | 时间日期格式,通过特定的格式化符号来定义显示样式,例如 yyyy/M/d H:mm 。格式化符号含义如下: - y :表示年份 - M :表示月份 - d :表示日期 - H :表示小时 - m :表示分钟 - s :表示秒 不同语言 / 库的设定规则存在差异,使用时需查阅相关文档。 |
minimumDateTime | 最小时间日期,限制用户能选择的最早日期和时间,若选择的日期时间早于此值,控件会进行相应调整。 |
maximumDateTime | 最大时间日期,限制用户能选择的最晚日期和时间,若选择的日期时间晚于此值,控件会进行相应调整。 |
timeSpec | 时间规范,决定控件显示的时间类型,有以下几种取值: - Qt::LocalTime :显示本地时间。 - Qt::UTC :显示协调世界时(UTC)。 - Qt::OffsetFromUTC :显示相对于 UTC 的偏移量(时差)。 |
4.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
dateChanged(QDate) | 当 QDateTimeEdit 中的日期部分发生改变时触发该信号。无论是用户手动输入新日期、通过日期选择器更改日期,还是通过代码修改日期,只要日期发生变化就会触发。 | QDate 类型,代表当前控件中最新的日期值。 |
timeChanged(QTime) | 当 QDateTimeEdit 中的时间部分发生改变时触发该信号。时间的改变可能是用户手动输入新时间、使用时间调整按钮修改时间,或者通过代码修改时间等情况。 | QTime 类型,代表当前控件中最新的时间值。 |
dateTimeChanged(QDateTime) | 当 QDateTimeEdit 中的日期或者时间任意一个发生改变时触发该信号。也就是说,只要日期、时间其中之一有变动,或者两者同时变动,都会触发此信号。 | QDateTime 类型,代表当前控件中最新的日期和时间组合值。 |
4.3 例子1,计算年龄
在Qt Designer
中设置基本框架
使用daysTo()
和secsTo()
计算相差的天数和秒数。但是daysTo()
在
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
int Widget::monthBetween(const QDateTime &start, const QDateTime &end)
{
int startYear = start.date().year();
int startMonth = start.date().month();
int startDay = start.date().day();
int endYear = end.date().year();
int endMonth = end.date().month();
int endDay = end.date().day();
int monthsDiff = (endYear*12+endMonth) - (startYear*12+startMonth); // 计算月份差值
if(endDay < startDay) {
// 如果第二个日期的日小于第一个日期的日,说明还未到完整的一个月,需要将月数差值减 1。
monthsDiff--;
}
return monthsDiff;
}
int Widget::yearBetween(const QDateTime &start, const QDateTime &end)
{
int startYear = start.date().year();
int startMonth = start.date().month();
int startDay = start.date().day();
int endYear = end.date().year();
int endMonth = end.date().month();
int endDay = end.date().day();
int yearsDiff = endYear - startYear;
if(endMonth < startMonth ||
(endMonth == startMonth && endDay < startDay)) {
// 比较两个日期的月份和日期,如果第二个日期的月份和日期小于第一个日期的月份和日期,那么年份差值需要减 1。
yearsDiff--;
}
return yearsDiff;
}
int Widget::daysBetweenFake(const QDateTime &start, const QDateTime &end)
{
int year = yearBetween(start, end);
int month = (monthBetween(start, end)) % 12;
// 把开始日期加上相差的年数和月数,得到一个临时日期 temp
QDateTime tmp = start.addYears(year).addMonths(month);
return start.daysTo(end) - start.daysTo(tmp);
}
void Widget::on_pushButton_clicked()
{
QDateTime d1 = ui->dateTimeEdit->dateTime();
QDateTime d2 = ui->dateTimeEdit_2->dateTime();
int secs = d1.secsTo(d2);
int hour = (secs / 3600) % 24;
int year = yearBetween(d1, d2);
int month = (monthBetween(d1, d2)) % 12;
int days = daysBetweenFake(d1, d2);
// qDebug() << year << ' ' << month << ' ' << days;
QString text = (QString("两日期相差:") + QString::number(year)
+QString("年 " + QString::number(month))
+QString("月 " + QString::number(days))
+QString("日") + QString::number(hour)
+QString("小时"));
ui->label->setText(text);
}
由于Qt内置的daysTo()
在计算不足一天时会算作一天,所以会有下面的情况
显然不符合常理,我们可以自己写一个myDaysTo()
,具体实现如下
// 我的daysTo(), 不足一天, 不算一天
int Widget::myDaysTo(const QDateTime &start, const QDateTime &end)
{
int secs = start.secsTo(end);
return (secs / 86400); // 一天是86400秒
}
这样就正确了
6. QDial
QDial
表示一个旋钮
6.1 常用属性
属性 | 说明 |
---|---|
value | 表示 QDial 持有的当前数值,可通过该属性获取或设置 QDial 所代表的值。 |
minimum | QDial 允许设置的最小值,用户无法将 QDial 的值调整到小于该值。 |
maximum | QDial 允许设置的最大值,用户无法将 QDial 的值调整到大于该值。 |
singleStep | 当按下方向键(如上下左右键)时,QDial 的数值改变的步长。例如,设置为 1,则按一次方向键,数值增加或减少 1。 |
pageStep | 当按下 PageUp 或 PageDown 键时,QDial 的数值改变的步长。通常该步长会比 singleStep 大,用于快速调整数值。 |
sliderPosition | 界面上旋钮显示的初始位置,即 QDial 初始化时旋钮所在的位置,对应的是具体的数值。 |
tracking | 决定 QDial 的外观是否会跟踪数值变化。默认值为 true ,一般情况下不需要修改。当设置为 true 时,旋钮会随着数值的改变实时移动;设置为 false 时,旋钮可能会在用户操作结束后才更新位置。 |
wrapping | 表示是否允许循环调整。若设置为 true ,当数值超过最大值时,会回到最小值继续调整;当数值小于最小值时,会回到最大值继续调整,即调整过程可以 “套圈”。若设置为 false ,则不允许这种循环调整。 |
notchesVisible | 控制是否显示刻度线。设置为 true 时,QDial 会显示刻度线;设置为 false 时,刻度线不会显示。 |
notchTarget | 用于设置刻度线之间的相对位置。该数值越大,刻度线越稀疏;数值越小,刻度线越密集。通过调整该属性,可以改变刻度线的显示密度。 |
6.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
valueChanged(int) | 当 QDial 持有的数值发生改变时触发该信号。数值的改变可能是用户通过鼠标拖动旋钮、按下方向键、PageUp /PageDown 键等操作引起的,也可能是通过代码修改 value 属性导致的。 | int 类型,代表 QDial 当前最新的数值。 |
rangeChanged(int, int) | 当 QDial 的取值范围(即 minimum 和 maximum 属性)发生变化时触发该信号。范围的改变可以通过代码调用 setMinimum() 、setMaximum() 等方法来实现。 | 两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。 |
6.3 例子1,调整窗口不透明度
在Qt Designer
中设置基本框架
设置槽函数
void Widget::on_dial_valueChanged(int value)
{
double n = (double)ui->dial->value() / 100;
setWindowOpacity(n);
QString text = QString("不透明度:") +QString::number(value);
ui->label->setText(text);
}
运行结果如下
7. QSlider
QSlider
表示一个滑动条,属性和信号与QDial
类似,这两个都继承自QAbstractSlider
7.1 常用属性
属性 | 说明 |
---|---|
value | 滑动条当前持有的数值,可通过编程方式设置或获取,反映滑动条所处位置对应的数值。 |
minimum | 滑动条允许设置的最小值,限制了滑动条可到达的最左(水平)或最上(垂直)位置对应的数值。 |
maximum | 滑动条允许设置的最大值,限制了滑动条可到达的最右(水平)或最下(垂直)位置对应的数值。 |
singleStep | 当按下方向键时,滑动条数值改变的步长。例如设置为 1,按一次方向键,数值增加或减少 1。 |
pageStep | 当按下 PageUp 或 PageDown 键时,滑动条数值改变的步长,通常用于快速调整数值,一般比 singleStep 大。 |
sliderPosition | 滑动条显示的初始位置,即滑动条在界面初始化时滑块所处的位置,对应着具体的数值。 |
tracking | 决定滑动条的外观是否会跟踪数值变化。默认值为 true ,意味着滑块会随着数值的改变实时移动;若设置为 false ,滑块可能在用户操作结束后才更新位置。一般情况下无需修改此属性。 |
orientation | 用于指定滑动条的方向,可设置为水平(Qt::Horizontal )或垂直(Qt::Vertical )。 |
invertedAppearance | 若设置为 true ,会翻转滑动条的方向。例如水平滑动条,正常是从左到右数值增大,设置后变为从右到左数值增大;垂直滑动条则是从下到上数值增大变为从上到下数值增大。 |
tickPosition | 确定刻度的位置,取值有多种: - QSlider::NoTicks :不显示刻度。 - QSlider::TicksAbove (水平)/ QSlider::TicksLeft (垂直):刻度显示在滑动条上方(水平)或左侧(垂直)。 - QSlider::TicksBelow (水平)/ QSlider::TicksRight (垂直):刻度显示在滑动条下方(水平)或右侧(垂直)。 - QSlider::TicksBothSides :刻度显示在滑动条两侧。 |
tickInterval | 控制刻度的密集程度,指定相邻两个刻度之间的数值间隔。例如设置为 10,则每隔 10 个数值显示一个刻度。 |
7.2 常用信号
信号 | 说明 | 参数 |
---|---|---|
valueChanged(int) | 当 QSlider 的数值发生改变时触发该信号。数值改变可能是用户拖动滑块、使用键盘方向键、按下 PageUp /PageDown 键,或者通过代码修改 value 属性等操作引起的。 | int 类型,表示 QSlider 当前的最新数值。 |
rangeChanged(int, int) | 当 QSlider 的取值范围(即 minimum 和 maximum 属性)发生变化时触发该信号。范围的改变通常是通过代码调用 setMinimum() 、setMaximum() 或 setRange() 方法实现的。 | 两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。 |
7.3 例子1,调整窗口大小
在Qt Designer
中设置基本框架
设置槽函数
// 设置宽度
void Widget::on_horizontalSlider_valueChanged(int value)
{
QRect pos = geometry();
setGeometry(pos.x(), pos.y(), value, pos.height());
}
// 设置高度
void Widget::on_verticalSlider_valueChanged(int value)
{
QRect pos = geometry();
setGeometry(pos.x(), pos.y(), pos.width(), value);
}
可以通过滑动条调整窗口大小
7.3 例子2,快捷键调整
在Qt Designer
中设置基本框架
widget.cpp
如下
#include "widget.h"
#include "ui_widget.h"
#include <QShortcut>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置快捷键
QShortcut* s1 = new QShortcut(this);
QShortcut* s2 = new QShortcut(this);
s1->setKey(QKeySequence("-"));
s2->setKey(QKeySequence("="));
// 设置槽函数
connect(s1, &QShortcut::activated, this, &Widget::reduceValue);
connect(s2, &QShortcut::activated, this, &Widget::addValue);
}
void Widget::addValue()
{
int value = ui->horizontalSlider->value() + 5;
if(value > ui->horizontalSlider->maximum()) return;
ui->horizontalSlider->setValue(value);
}
void Widget::reduceValue()
{
int value = ui->horizontalSlider->value() - 5;
if(value < ui->horizontalSlider->minimum()) return;
ui->horizontalSlider->setValue(value);
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_horizontalSlider_valueChanged(int value)
{
ui->label->setText("当前value:" + QString::number(value));
}
运行结果:可以通过-
和+
调整滑动条