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

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

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注册一个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中设置基本框架

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);      // 转成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;
}

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[b01lers2020]Life on Mars1

打开题目页面如下 看了旁边的链接&#xff0c;也没有什么注入点&#xff0c;是正常的科普 利用burp suite抓包&#xff0c;发现传参 访问一下 http://5edaec92-dd87-4fec-b0e3-501ff24d3650.node5.buuoj.cn:81/query?searchtharsis_rise 接下来进行sql注入 方法一&#xf…

前端自动化测试(一):揭秘自动化测试秘诀

目录 [TOC](目录)前言自动化测试 VS 手动测试测试分类何为单元测试单元测试的优缺点优点缺点 测试案例测试代码 测试函数的封装实现 expect 方法实现 test 函数结语 正文开始 &#xff0c; 如果觉得文章对您有帮助&#xff0c;请帮我三连订阅&#xff0c;谢谢&#x1f496;&…

FFmpeg工具使用基础

一、FFmpeg工具介绍 FFmpeg命令行工具主要包括以下几个部分: ‌ffmpeg‌:编解码工具‌ffprobe‌:多媒体分析器‌ffplay‌:简单的音视频播放器这些工具共同构成了FFmpeg的核心功能,支持各种音视频格式的处理和转换‌ 二、在Ubuntu18.04上安装FFmpeg工具 1、sudo apt-upda…

upload labs靶场

upload labs靶场 注意:本人关卡后面似乎相比正常的关卡少了一关&#xff0c;所以每次关卡名字都是1才可以和正常关卡在同一关 一.个人信息 个人名称&#xff1a;张嘉玮 二.解题情况 三.解题过程 题目&#xff1a;up load labs靶场 pass 1前后端 思路及解题&#xff1a;…

解锁豆瓣高清海报(二) 使用 OpenCV 拼接和压缩

解锁豆瓣高清海报(二): 使用 OpenCV 拼接和压缩 脚本地址: 项目地址: Gazer PixelWeaver.py pixel_squeezer_cv2.py 前瞻 继上一篇“解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路”成功爬取豆瓣电影海报之后&#xff0c;本文将介绍如何使用 OpenCV 对这些海报进行智…

C++:虚函数与多态性习题2

题目内容&#xff1a; 编写程序&#xff0c;声明抽象基类Shape&#xff0c;由它派生出3个派生类&#xff1a;Circle、Rectangle、Triangle&#xff0c;用虚函数分别计算图形面积&#xff0c;并求它们的和。要求用基类指针数组&#xff0c;使它每一个元素指向一个派生类对象。 …

JVM运行时数据区域-附面试题

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域 有各自的用途&#xff0c;以及创建和销毁的时间&#xff0c;有的区域随着虚拟机进程的启动而一直存在&#xff0c;有些区域则是 依赖用户线程的启动和结束而建立和销毁。 1. 程序计…

电脑优化大师-解决电脑卡顿问题

我们常常会遇到电脑运行缓慢、网速卡顿的情况&#xff0c;但又不知道是哪个程序在占用过多资源。这时候&#xff0c;一款能够实时监控网络和系统状态的工具就显得尤为重要了。今天&#xff0c;就来给大家介绍一款小巧实用的监控工具「TrafficMonitor」。 「TrafficMonitor 」是…

跨组织环境下 MQTT 桥接架构的评估

论文标题 中文标题&#xff1a; 跨组织环境下 MQTT 桥接架构的评估 英文标题&#xff1a; Evaluation of MQTT Bridge Architectures in a Cross-Organizational Context 作者信息 Keila Lima, Tosin Daniel Oyetoyan, Rogardt Heldal, Wilhelm Hasselbring Western Norway …

Baklib揭示内容中台实施最佳实践的策略与实战经验

内容概要 在当前数字化转型的浪潮中&#xff0c;内容中台的概念日益受到关注。它不再仅仅是一个内容管理系统&#xff0c;而是企业提升运营效率与灵活应对市场变化的重要支撑平台。内容中台的实施离不开最佳实践的指导&#xff0c;这些实践为企业在建设高效内容中台时提供了宝…

牛客周赛round78 B,C

B.一起做很甜的梦 题意&#xff1a;就是输出n个数&#xff08;1-n&#xff09;&#xff0c;使输出的序列中任意选连续的小序列&#xff08;小序列长度>2&&<n-1&#xff09;不符合排列&#xff08;例如如果所选长度为2&#xff0c;在所有长度为2 的小序列里不能出…

微机原理与接口技术期末大作业——4位抢答器仿真

在微机原理与接口技术的学习旅程中&#xff0c;期末大作业成为了检验知识掌握程度与实践能力的关键环节。本次我选择设计并仿真一个 4 位抢答器系统&#xff0c;通过这个项目&#xff0c;深入探索 8086CPU 及其接口技术的实际应用。附完整压缩包下载。 一、系统设计思路 &…

Android记事本App设计开发项目实战教程2025最新版Android Studio

平时上课录了个视频&#xff0c;从新建工程到打包Apk&#xff0c;从头做到尾&#xff0c;没有遗漏任何实现细节&#xff0c;欢迎学过Android基础的同学参加&#xff0c;如果你做过其他终端软件开发&#xff0c;也可以学习&#xff0c;快速上手Android基础开发。 Android记事本课…

设计模式Python版 组合模式

文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…

4-图像梯度计算

文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…

MATLAB实现多种群遗传算法

多种群遗传算法&#xff08;MPGA, Multi-Population Genetic Algorithm&#xff09;是一种改进的遗传算法&#xff0c;它通过将种群分成多个子种群并在不同的子种群之间进行交叉和交换&#xff0c;旨在提高全局搜索能力并避免早期收敛。下面是多种群遗传算法的主要步骤和流程&a…

WebRtc06: 音视频数据采集

音视频采集API 通过getUserMedia这个API去获取视频音频&#xff0c; 通过constraints这个对象去配置偏好&#xff0c;比如视频宽高、音频降噪等 测试代码 index.html <html><head><title>WebRtc capture video and audio</title></head><…

浅析CDN安全策略防范

CDN&#xff08;内容分发网络&#xff09;信息安全策略是保障内容分发网络在提供高效服务的同时&#xff0c;确保数据传输安全、防止恶意攻击和保护用户隐私的重要手段。以下从多个方面详细介绍CDN的信息安全策略&#xff1a; 1. 数据加密 数据加密是CDN信息安全策略的核心之…

高温环境对电机性能的影响与LabVIEW应用

电机在高温环境下的性能可能受到多种因素的影响&#xff0c;尤其是对于持续工作和高负荷条件下的电机。高温会影响电机的效率、寿命以及可靠性&#xff0c;导致设备出现过热、绝缘损坏等问题。因此&#xff0c;在设计电机控制系统时&#xff0c;特别是在高温环境下&#xff0c;…

MapReduce简单应用(一)——WordCount

目录 1. 执行过程1.1 分割1.2 Map1.3 Combine1.4 Reduce 2. 代码和结果2.1 pom.xml中依赖配置2.2 工具类util2.3 WordCount2.4 结果 参考 1. 执行过程 假设WordCount的两个输入文本text1.txt和text2.txt如下。 Hello World Bye WorldHello Hadoop Bye Hadoop1.1 分割 将每个文…