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() 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注册一个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 标签,包括 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

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

当输入内容时:undoAvailable为true,点击撤销后,undoAvailable为false,redoAvailable为true,点击反撤销后,redoAvailable为false,undoAvailable为true。

image-20250130164924516


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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/894356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有没有个性化的UML图例

绿萝小绿萝 (53****338) 2012-05-10 11:55:45 各位大虾&#xff0c;有没有个性化的UML图例 绿萝小绿萝 (53****338) 2012-05-10 11:56:03 例如部署图或时序图的图例 潘加宇 (35***47) 2012-05-10 12:24:31 "个性化"指的是&#xff1f; 你的意思使用你自己的图标&…

Go学习:字符、字符串需注意的点

Go语言与C/C语言编程有很多相似之处&#xff0c;但是Go语言中在声明一个字符时&#xff0c;数据类型与其他语言声明一个字符数据时有一点不同之处。通常&#xff0c;字符的数据类型为 char&#xff0c;例如 &#xff1a;声明一个字符 (字符名称为 ch) 的语句格式为 char ch&am…

本地部署 DeepSeek-R1 模型

文章目录 霸屏的AIDeepSeek是什么&#xff1f;安装DeepSeek安装图形化界面总结 霸屏的AI 最近在刷视频的时候&#xff0c;总是突然突然出现一个名叫 DeepSeek 的玩意&#xff0c;像这样&#xff1a; 这样&#xff1a; 这不经激起我的一顿好奇心&#xff0c;这 DeepSeek 到底是个…

断裂力学课程报告

谈谈你对线弹性断裂力学和弹塑性断裂力学的认识 经过对本课程的学习&#xff0c;我首先认识到断裂力学研究的是宏观的断裂问题&#xff0c;而不是研究属于断裂物理研究范围的微观结构断裂机理。断裂力学从材料内部存在缺陷出发&#xff0c;研究裂纹的生成、亚临界拓展&#xff…

代码随想录刷题day22|(字符串篇)344.反转字符串、541.反转字符串 II

目录 一、题目思路 二、相关题目 三、总结与知识点 3.1 字符数组转换成字符串 一、题目思路 344反转字符串比较容易&#xff0c;双指针即可在空间复杂度为O(1)的基础上解决&#xff1b; 541反转字符串II &#xff1a;其中for循环中 i 每次的取值&#xff0c;不是 i&#…

【机器学习】自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

一、使用pytorch框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。将 numpy 数组转换为 PyTorch 张量&#xff0c;方便后续在模型中…

使用Visual Studio打包Python项目

1. 安装Visual Studio 首先&#xff0c;你需要在你的计算机上安装Visual Studio。 2. 创建项目 在Visual Studio中创建一个新的Python项目。 打开Visual Studio&#xff0c;点击“File”&#xff08;文件&#xff09; -> “New”&#xff08;新建&#xff09; -> “Pr…

TVM调度原语完全指南:从入门到微架构级优化

调度原语 在TVM的抽象体系中&#xff0c;调度&#xff08;Schedule&#xff09;是对计算过程的时空重塑。每一个原语都是改变计算次序、数据流向或并行策略的手术刀。其核心作用可归纳为&#xff1a; 优化目标 max ⁡ ( 计算密度 内存延迟 指令开销 ) \text{优化目标} \max…

51单片机——串口向电脑发送数据

引言 在电子技术领域&#xff0c;51 单片机作为一种广泛应用的微控制器&#xff0c;其串口通信功能具有重要意义。通过串口&#xff0c;51 单片机能够与电脑等外部设备进行数据交互&#xff0c;实现各种复杂的功能&#xff0c;为许多应用场景提供了可能。 51 单片机串口通信基…

高性能消息队列Disruptor

定义一个事件模型 之后创建一个java类来使用这个数据模型。 /* <h1>事件模型工程类&#xff0c;用于生产事件消息</h1> */ no usages public class EventMessageFactory implements EventFactory<EventMessage> { Overridepublic EventMessage newInstance(…

Java线程认识和Object的一些方法ObjectMonitor

专栏系列文章地址&#xff1a;https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标&#xff1a; 要对Java线程有整体了解&#xff0c;深入认识到里面的一些方法和Object对象方法的区别。认识到Java对象的ObjectMonitor&#xff0c;这有助于后面的Synchron…

基于YOLO11的肺结节检测系统

基于YOLO11的肺结节检测系统 (价格90) LUNA16数据集 数据一共 1186张 按照8&#xff1a;1&#xff1a;1随机划分训练集&#xff08;948张&#xff09;、验证集&#xff08;118张&#xff09;与测试集&#xff08;120张&#xff09; 包含 nodule 肺结节 1种…

C++ Primer 自定义数据结构

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

FFmpeg源码:av_base64_decode函数分析

一、引言 Base64&#xff08;基底64&#xff09;是一种基于64个可打印字符来表示二进制数据的表示方法。由于log2 646&#xff0c;所以每6个比特为一个单元&#xff0c;对应某个可打印字符。3个字节相当于24个比特&#xff0c;对应于4个Base64单元&#xff0c;即3个字节可由4个…

白话DeepSeek-R1论文(三)| DeepSeek-R1蒸馏技术:让小模型“继承”大模型的推理超能力

最近有不少朋友来询问Deepseek的核心技术&#xff0c;陆续针对DeepSeek-R1论文中的核心内容进行解读&#xff0c;并且用大家都能听懂的方式来解读。这是第三篇趣味解读。 DeepSeek-R1蒸馏技术&#xff1a;让小模型“继承”大模型的推理超能力 当大模型成为“老师”&#xff0c…

curope python安装

目录 curope安装 测试: 报错:libc10.so: cannot open shared object file: No such file or directory 解决方法: curope安装 git clone : GitHub - Junyi42/croco at bd6f4e07d5c4f13ae5388efc052dadf142aff754 cd models/curope/ python setup.py build_ext --inplac…

pytorch实现变分自编码器

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 变分自编码器&#xff08;Variational Autoencoder, VAE&#xff09;是一种生成模型&#xff0c;属于深度学习中的无监督学习方法。它通过学习输入数据的潜在分布&#xff08;Latent Distribution&#xff09;&…

《AI大模型开发笔记》DeepSeek技术创新点

一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局&#xff01;革命性的上下文处理机制实现长文本推理成本断崖式下降&#xff0c;综合算力需求锐减90%&#xff0c;开启高效 AI 新纪元&#xff01; 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …

数仓实战项目,大数据数仓实战(离线数仓+实时数仓)

1.课程目标 2.电商行业与电商系统介绍 3.数仓项目整体技术架构介绍 4.数仓项目架构-kylin补充 5.数仓具体技术介绍与项目环境介绍 6.kettle的介绍与安装 7.kettle入门案例 这个连线是点击shift键&#xff0c;然后鼠标左键拖动 ctrls保存一下 csv输入配置 Excel输出配置 配置完 …

Spring Web MVC基础第一篇

目录 1.什么是Spring Web MVC&#xff1f; 2.创建Spring Web MVC项目 3.注解使用 3.1RequestMapping&#xff08;路由映射&#xff09; 3.2一般参数传递 3.3RequestParam&#xff08;参数重命名&#xff09; 3.4RequestBody&#xff08;传递JSON数据&#xff09; 3.5Pa…