当前位置: 首页 > article >正文

Qt常用控件 输入类控件

文章目录

  • 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中设置基本框架

image-20250129162929523

widget.cpp核心代码如下

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 设置nameui->lineEdit_name->setPlaceholderText("请输入姓名");ui->lineEdit_name->setClearButtonEnabled(true);// 设置phoneui->lineEdit_phone->setPlaceholderText("请输入电话");ui->lineEdit_phone->setClearButtonEnabled(true);ui->lineEdit_phone->setInputMask("000-0000-0000");      // 0表示数字, 也可以是其它数字// 设置passwordui->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();
}

点击提交后,将结果打印到控制台上

image-20250129163256626

1.4 例子2,正则验证手机号

const QValidator *QLineEdit::validator() constQLineEdit 类中的一个成员函数:
该函数的主要功能是获取当前 QLineEdit 控件所使用的验证器对象的指针


QValidator::State QValidator::validate(QString &input, int &pos) constQValidator 类中的一个纯虚函数,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注册一个validatorui->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中设置基本框架

image-20250129213111430

设置槽函数

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();
}

image-20250129213134939

1.6 例子4,显示密码

Qt Designer中设置基本框架

image-20250129214318374

设置槽函数

void Widget::on_checkBox_stateChanged(int state)
{if(state == Qt::Checked) {ui->lineEdit->setEchoMode(QLineEdit::Normal);} else {ui->lineEdit->setEchoMode(QLineEdit::Password);}
}

image-20250129214734148

2. QTextEdit

QTextEdit表示多行输入框

2.1 常用属性

属性说明
plainText当前文本内容(以纯文本形式)。获取当前文本内容(纯文本格式)使用的是toPlainText()
markdown输入框内持有的内容,支持 Markdown 格式,能够自动将 Markdown 文本渲染成 HTML。toMarkdown()获取内容
html输入框内持有的内容,可以支持大部分 HTML 标签,包括 imgtable 等。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

image-20250130161245882

给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();
}

image-20250130163957591


void Widget::on_textEdit_cursorPositionChanged()
{const QTextCursor cursor = ui->textEdit->textCursor();qDebug() << "cursorPositionChanged: "<< cursor.position();
}

image-20250130164458759


void Widget::on_textEdit_undoAvailable(bool b)
{qDebug() << "undoAvailable: "<< b;
}void Widget::on_textEdit_redoAvailable(bool b)
{qDebug() << "redoAvailable: "<< b;
}

当输入内容时:undoAvailabletrue,点击撤销后,undoAvailablefalseredoAvailabletrue,点击反撤销后,redoAvailablefalseundoAvailabletrue

image-20250130164924516


void Widget::on_textEdit_copyAvailable(bool b)
{qDebug() << "copyAvailable: "<< b;
}

当选中内容时,copyAvailabletrue

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中设置基本框架

image-20250130175135037

既可以在代码中设置,也可以在Qt Designer中设置下拉框中的条目。右键->编辑项目->编辑组合框->点击+号,添加各种条目

image-20250130175430385

添加一个按钮,给按钮添加槽函数

void Widget::on_pushButton_clicked()
{qDebug() << ui->comboBox->currentText()   << ' '<< ui->comboBox_2->currentText() << ' '<< ui->comboBox_3->currentText() << ' ';
}

image-20250130181657951

2.4 例子2,从文件读取内容

当前目录下有一个food.txt

image-20250131165036776

Qt Designer中设置基本框架

image-20250131172611266

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);      // 转成QStringQStringList list = str.split("\r\n");               // 切割, 转成QStringListlist.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;
}

image-20250131172719595

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中设置基本框架

image-20250131193318851

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;
}

image-20250131193351351

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中设置基本框架

image-20250131212503447

使用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;// 把开始日期加上相差的年数和月数,得到一个临时日期 tempQDateTime 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);
}

image-20250131213606743


由于Qt内置的daysTo()在计算不足一天时会算作一天,所以会有下面的情况

image-20250131214843492

显然不符合常理,我们可以自己写一个myDaysTo(),具体实现如下

// 我的daysTo(), 不足一天, 不算一天
int Widget::myDaysTo(const QDateTime &start, const QDateTime &end)
{int secs = start.secsTo(end);return (secs / 86400);      // 一天是86400秒
}

这样就正确了

image-20250131215611225

6. QDial

QDial表示一个旋钮

6.1 常用属性

属性说明
value表示 QDial 持有的当前数值,可通过该属性获取或设置 QDial 所代表的值。
minimumQDial 允许设置的最小值,用户无法将 QDial 的值调整到小于该值。
maximumQDial 允许设置的最大值,用户无法将 QDial 的值调整到大于该值。
singleStep当按下方向键(如上下左右键)时,QDial 的数值改变的步长。例如,设置为 1,则按一次方向键,数值增加或减少 1。
pageStep当按下 PageUpPageDown 键时,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 的取值范围(即 minimummaximum 属性)发生变化时触发该信号。范围的改变可以通过代码调用 setMinimum()setMaximum() 等方法来实现。两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。

6.3 例子1,调整窗口不透明度

Qt Designer中设置基本框架

image-20250131231332905

设置槽函数

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);
}

运行结果如下

image-20250131231434502

7. QSlider

QSlider表示一个滑动条,属性和信号与QDial类似,这两个都继承自QAbstractSlider

7.1 常用属性

属性说明
value滑动条当前持有的数值,可通过编程方式设置或获取,反映滑动条所处位置对应的数值。
minimum滑动条允许设置的最小值,限制了滑动条可到达的最左(水平)或最上(垂直)位置对应的数值。
maximum滑动条允许设置的最大值,限制了滑动条可到达的最右(水平)或最下(垂直)位置对应的数值。
singleStep当按下方向键时,滑动条数值改变的步长。例如设置为 1,按一次方向键,数值增加或减少 1。
pageStep当按下 PageUpPageDown 键时,滑动条数值改变的步长,通常用于快速调整数值,一般比 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 的取值范围(即 minimummaximum 属性)发生变化时触发该信号。范围的改变通常是通过代码调用 setMinimum()setMaximum()setRange() 方法实现的。两个 int 类型的参数,第一个参数表示新的最小值,第二个参数表示新的最大值。

7.3 例子1,调整窗口大小

Qt Designer中设置基本框架

image-20250201130957835

设置槽函数

// 设置宽度
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);
}

可以通过滑动条调整窗口大小

image-20250201131028689

7.3 例子2,快捷键调整

Qt Designer中设置基本框架

image-20250201142417666

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));
}

运行结果:可以通过-+调整滑动条

相关文章:

Qt常用控件 输入类控件

文章目录 1.QLineEdit1.1 常用属性1.2 常用信号1.3 例子1&#xff0c;录入用户信息1.4 例子2&#xff0c;正则验证手机号1.5 例子3&#xff0c;验证输入的密码1.6 例子4&#xff0c;显示密码 2. QTextEdit2.1 常用属性2.2 常用信号2.3 例子1&#xff0c;获取输入框的内容2.4 例…...

linux运行级别

运行级别&#xff1a;指linux系统在启动和运行过程中所处的不同的状态。 运行级别之间的切换&#xff1a;init (级别数) 示例&#xff1a; linux的运行级别一共有7种&#xff0c;分别是&#xff1a; 运行级别0&#xff1a;停机状态 运行级别1&#xff1a;单用户模式/救援模式…...

数据结构课程设计(四)校园导航

4 校园导航 4.1 需求规格说明 【问题描述】 一个学校平面图&#xff0c;至少包括10个以上的场所&#xff0c;每个场所带有编号、坐标、名称、类别等信息&#xff0c;两个场所间可以有路径相通&#xff0c;路长&#xff08;耗时&#xff09;各有不同。要求读取该校园平面图&a…...

50【Windows与Linux】

大家可能有些人听过Linux系统&#xff0c;很多初学者被灌输的理念就是服务器必须要装Linux系统 什么是系统&#xff1f; 比如你的电脑是Windows系统的&#xff0c;你手机是Android系统的&#xff0c;物理设备都需要系统&#xff0c;系统你可以理解成直接控制物理设备的一个东…...

蓝桥杯python基础算法(2-2)——基础算法(D)——进制转换*

目录 五、进制转换 十进制转任意进制&#xff0c;任意进制转十进制 例题 P1230 进制转换 作业 P2095 进制转化 作业 P2489 进制 五、进制转换 十进制转任意进制&#xff0c;任意进制转十进制 int_to_char "0123456789ABCDEF" def Ten_to_K(k, x):answer "…...

CSS 溢出内容处理:从基础到实战

CSS 溢出内容处理&#xff1a;从基础到实战 1. 什么是溢出&#xff1f;示例代码&#xff1a;默认溢出行为 2. 使用 overflow 属性控制溢出2.1 使用 overflow: hidden 裁剪内容示例代码&#xff1a;裁剪溢出内容 2.2 使用 overflow: scroll 显示滚动条示例代码&#xff1a;显示滚…...

嵌入式知识点总结 操作系统 专题提升(四)-上下文

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项&#xff1f; 5.请问线程需要保存哪些…...

Elasticsearch基本使用详解

文章目录 Elasticsearch基本使用详解一、引言二、环境搭建1、安装 Elasticsearch2、安装 Kibana&#xff08;可选&#xff09; 三、索引操作1、创建索引2、查看索引3、删除索引 四、数据操作1、插入数据2、查询数据&#xff08;1&#xff09;简单查询&#xff08;2&#xff09;…...

携程Android开发面试题及参考答案

在项目中,给别人发的动态点赞功能是如何实现的? 数据库设计:首先要在数据库中为动态表添加一个点赞字段,用于记录点赞数量,同时可能需要一个点赞关系表,记录用户与动态之间的点赞关联,包括点赞时间等信息。界面交互:在 Android 界面上,为点赞按钮设置点击事件监听器。…...

xxl-job 在 Java 项目的使用 以一个代驾项目中的订单模块举例

能搜到这里的最起码一定知道 xxl-job 是用来干什么的&#xff0c;我就不多啰嗦怎么下载以及它的历史了 首先我们要知道 xxl-job 这个框架的结构&#xff0c;如下图&#xff1a; xxl-job-master&#xff1a;xxl-job-admin&#xff1a;调度中心xxl-job-core&#xff1a;公共依赖…...

Alibaba开发规范_异常日志之日志规约:最佳实践与常见陷阱

文章目录 引言1. 使用SLF4J日志门面规则解释代码示例正例反例 2. 日志文件的保存时间规则解释 3. 日志文件的命名规范规则解释代码示例正例反例 4. 使用占位符进行日志拼接规则解释代码示例正例反例 5. 日志级别的开关判断规则解释代码示例正例反例 6. 避免重复打印日志规则解释…...

【数据分析】案例03:当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib)

当当网近30日热销图书的数据采集与可视化分析(scrapy+openpyxl+matplotlib) 当当网近30日热销书籍官网写在前面 实验目的:实现当当网近30日热销图书的数据采集与可视化分析。 电脑系统:Windows 使用软件:Visual Studio Code Python版本:python 3.12.4 技术需求:scrapy、…...

需求分析应该从哪些方面来着手做?

需求分析一般可从以下几个方面着手&#xff1a; 业务需求方面 - 与相关方沟通&#xff1a;与业务部门、客户等进行深入交流&#xff0c;通过访谈、问卷调查、会议讨论等方式&#xff0c;明确他们对项目的期望、目标和整体业务需求&#xff0c;了解项目要解决的业务问题及达成的…...

申博经验贴

1. 所谓申博&#xff0c;最重要的就是定制的海投 分成两个部分 1. 定制 要根据每个教授去写不同的&#xff0c;一定不要泛泛的去写&#xff0c;一定要非常非常的具体&#xff0c;要引起教授的兴趣。每个教授每天都会收到几十封邮件&#xff0c;所以要足够的引起教授的注意&a…...

SpringAI 人工智能

随着 AI 技术的不断发展&#xff0c;越来越多的企业开始将 AI 模型集成到其业务系统中&#xff0c;从而提升系统的智能化水平、自动化程度和用户体验。在此背景下&#xff0c;Spring AI 作为一个企业级 AI 框架&#xff0c;提供了丰富的工具和机制&#xff0c;可以帮助开发者将…...

虚幻基础17:动画层接口

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 animation layer interface animation layer interface 动画层接口&#xff1a;动画图表的集。仅有名字。 添加到动画蓝图中&#xff0c;由动画蓝图实现动画图表。...

SQLAlchemy 2.0的简单使用教程

SQLAlchemy 2.0相比1.x进行了很大的更新&#xff0c;目前网上的教程不多&#xff0c;以下以链接mysql为例介绍一下基本的使用方法 环境及依赖 Python:3.8 mysql:8.3 Flask:3.0.3 SQLAlchemy:2.0.37 PyMySQL:1.1.1使用步骤 1、创建引擎&#xff0c;链接到mysql engine crea…...

Codeforces Round 1002 (Div. 2) A-D

复活&#xff01;年后首场&#xff01;本期封面是我自己AI弄的图 A - Milya and Two Arrays 题意 给两个所有数字出现次数都大于2的数组&#xff0c;问能不能修改排序之后对应位置相加得到新的数组使不同数字个数达到3 思路 直接计数就行了&#xff0c;不同的数字匹配一下…...

OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)

文章目录 摄像机/观察空间/视图变换LookAt矩阵移动相机&#xff08;处理键盘输入&#xff09;移动速度欧拉角移动视角&#xff08;处理鼠标输入&#xff09;缩放场景&#xff08;处理滚轮输入&#xff09;Camera类 摄像机/观察空间/视图变换 在上一节变换中&#xff0c;我们讨…...

『VUE』vue-quill-editor富文本编辑器添加按钮houver提示(详细图文注释)

目录 预览效果新建一个config.js存放标题编写添加提示的方法调用添加标题方法的生命周期总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 预览效果 新建一个config.js存放标题 export const titleConfig [{ Choice: .ql-bold…...

如何使用 DeepSeek 和 Dexscreener 构建免费的 AI 加密交易机器人?

我使用DeepSeek AI和Dexscreener API构建的一个简单的 AI 加密交易机器人实现了这一目标。在本文中&#xff0c;我将逐步指导您如何构建像我一样的机器人。 DeepSeek 最近发布了R1&#xff0c;这是一种先进的 AI 模型。您可以将其视为 ChatGPT 的免费开源版本&#xff0c;但增加…...

Kafka流式计算架构

引言 Kafka 凭借其卓越的架构设计&#xff0c;具备极为高效的流式计算能力&#xff0c;在海量数据环境下&#xff0c;依然能够以惊人的速度实现消息的高性能消费&#xff0c;轻松应对高并发、低延迟的严苛业务需求。无论是实时数据处理、复杂事件分析&#xff0c;还是大规模数…...

C++泛型编程06(默认模板实参)

文章目录 1.4 默认模板实参 (Default Template Arguments)示例&#xff1a;灵活定义返回类型 当然&#xff0c;这里是对关于默认模板实参(Default Template Arguments)的内容进行了改进和优化后的叙述&#xff1a; 1.4 默认模板实参 (Default Template Arguments) 在C中&…...

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...

SRS代码目录

代码目录&#xff1a; src/目录下核心代码&#xff1a; core&#xff1a;核心功能模块&#xff0c;包括日志、配置、错误处理等&#xff1b;protocol&#xff1a;实现RTMP、HTTP-FLV、HLS等协议的模块&#xff1b;app&#xff1a;应用层的实现&#xff0c;包括流的发布、播放…...

C++STL(一)——string类

目录 一、string的定义方式二、 string类对象的容量操作三、string类对象的访问及遍历操作四、string类对象的修改操作五、string类非成员函数 一、string的定义方式 string是个管理字符数组的类&#xff0c;其实就是字符数组的顺序表。 它的接口也是非常多的。本章介绍一些常…...

机器学习--1.KNN机器学习入门

1、机器学习概述 1.1、什么是机器学习 机器学习&#xff08;Machine Learning&#xff09;是人工智能&#xff08;Artificial Intelligence&#xff09;领域的一个子集&#xff0c;它主要关注如何让计算机系统通过经验学习&#xff08;数据&#xff09;并自动改进性能。机器学…...

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的&#xff0c;是一家日本AI公司SakanaAI的论文&#xff08;我以前写过他们的不训练提升模型的能力的文章&#xff0c;感兴趣可以去翻&#xff09;它家有Lion Jones坐镇…...

三路排序算法

三路排序算法 引言 排序算法是计算机科学中基础且重要的算法之一。在数据分析和处理中&#xff0c;排序算法的效率直接影响着程序的执行速度和系统的稳定性。本文将深入探讨三路排序算法&#xff0c;包括其原理、实现和应用场景。 一、三路排序算法的原理 三路排序算法是一…...

代码随想录day27

669. /** lc appleetcode.cn id669 langcpp** [669] 修剪二叉搜索树*/// lc codestart /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}…...