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

QT基础八、与时间相关的UI控件

目录

一、时间类:QTime

1. 创建 QTime 对象

2. 获取当前时间

3. 设置时间

4. 时间格式化

 5. 时间加减操作

6. 时间比较

7. 计算时间间隔

8. 判断时间是否有效

9. 使用 QElapsedTimer 测量时间间隔

二、日期类:QDate

1. 创建 QDate 对象

2. 获取当前日期

3. 设置日期

4. 日期格式化

5. 日期加减操作

6. 日期比较

7. 计算日期间隔

8. 判断日期是否有效

9. 获取日期信息

10. 获取星期几

11. 获取一年中的第几天

12. 获取月份的天数

13. 获取一年的天数

14. 判断是否为闰年

三、日期时间类:QDateTime

1. 创建 QDateTime 对象

2. 获取当前日期和时间

3. 设置日期和时间

4. 日期和时间格式化

5. 时间加减操作

6. 时间比较

7. 计算时间间隔

8. 判断日期和时间是否有效

9. 获取时间戳

10. 从时间戳创建 QDateTime

11. 转换时区

12. 获取日期和时间信息

四、时间、日期编辑控件:QDateEdit、QTimeEdit、QDateTimeEdit

编程实战,创建一个如下的界面:

1、创建时间编辑器

槽函数代码:

2、 创建日期编辑器

 槽函数代码:

3、日期时间编辑器

 槽函数代码:

4、运行结果

五、日历控件:QCalendarWidget

1.、基本功能

2、先做出如下的页面

3、常用信号

4、生成槽函数 

5、槽函数代码

 6、运行结果

 六、定时器:Timer

1、创建一个如下的界面

 2、什么是TimerType

 3、dialog.h的代码

4、dialog.cpp的代码

5、运行结果


一、时间类:QTime

QTime 是 Qt 框架中的一个类,用于处理时间和执行与时间相关的操作。它主要用于表示一天中的时间(小时、分钟、秒和毫秒),而不涉及日期。QTime 提供了许多有用的功能,例如时间的设置、比较、加减操作等。

1. 创建 QTime 对象
#include <QTime>// 创建一个无效的 QTime 对象
QTime time;// 创建一个指定时间的 QTime 对象 (小时, 分钟, 秒, 毫秒)
QTime time1(14, 30, 0);  // 14:30:00
QTime time2(14, 30, 0, 500);  // 14:30:00.500//由字符串转化
QTime time3 = QTime::fromString("12:55:32");QString str = "10点10分";
QTime time4 = QTime::fromString(str, "hh点mm分");    //10:10:00.000
2. 获取当前时间
QTime currentTime = QTime::currentTime();
qDebug() << "当前时间:" << currentTime.toString("hh:mm:ss.zzz");
3. 设置时间
QTime time;
time.setHMS(10, 15, 30);  // 设置时间为 10:15:30
qDebug() << "Set Time:" << time.toString("hh:mm:ss");
4. 时间格式化
QTime time(14, 30, 45, 123);
qDebug() << time.toString("hh:mm:ss.zzz");  // 输出: 14:30:45.123
qDebug() << time.toString("hh:mm");  // 输出: 14:30QTime time2 = QTime::currentTime();
qDebug() << time2.toString("h:m:s.zzz");

常用的格式符:

  • h:小时(无前导零)
  • hh:小时(有前导零)
  • m:分钟(无前导零)
  • mm:分钟(有前导零)
  • s:秒(无前导零)
  • ss:秒(有前导零)
  • z:毫秒(无前导零)
  • zzz:毫秒(有前导零)
 5. 时间加减操作
QTime time(14, 30, 0);// 加上 90 秒
QTime newTime = time.addSecs(90);
qDebug() << "加了90秒后:" << newTime.toString("hh:mm:ss");// 减去 5000 毫秒
QTime newTime2 = time.addMSecs(-5000);
qDebug() << "减去5000毫秒后:" << newTime2.toString("hh:mm:ss.zzz");
6. 时间比较

可以使用 operator<, operator>, operator== 等运算符来比较两个 QTime 对象:

QTime time1(14, 30, 0);
QTime time2(15, 0, 0);if (time1 < time2) {qDebug() << "time1 < time2";
} else if (time1 > time2) {qDebug() << "time1 > time2";
} else {qDebug() << "time1 == same";
}
7. 计算时间间隔
QTime time1(14, 30, 0);
QTime time2(15, 0, 0);//相当于 time2 - time1
int secs = time1.secsTo(time2);  // 返回两个时间之间的秒数
qDebug() << "time1 和 time2 之间的秒数:" << secs;int msecs = time1.msecsTo(time2);  // 返回两个时间之间的毫秒数
qDebug() << "time1 和 time2 之间的毫秒数:" << msecs;
8. 判断时间是否有效
QTime time(25, 0, 0);  // 无效时间,因为小时数超过了 23
if (!time.isValid()) {qDebug() << "这是一个无效时间!";
}
9. 使用 QElapsedTimer 测量时间间隔
#include <QElapsedTimer>QElapsedTimer timer;
timer.start();// 执行一些操作
QThread::sleep(2);qint64 elapsed = timer.elapsed();  // 返回经过的毫秒数
qDebug() << "经过了:" << elapsed << "毫秒";

二、日期类:QDate

QDate 是 Qt 框架中的一个类,用于处理日期相关的操作。它可以表示年、月、日,并提供了许多有用的功能,例如日期的设置、比较、加减操作等。

1. 创建 QDate 对象
#include <QDate>// 创建一个无效的 QDate 对象
QDate date;// 创建一个指定日期的 QDate 对象 (年, 月, 日)
QDate date1(2023, 10, 5);  // 2023年10月5日
2. 获取当前日期
QDate currentDate = QDate::currentDate();
qDebug() << "当前日期是:" << currentDate.toString("yyyy-MM-dd");
3. 设置日期
QDate date;
date.setDate(2023, 10, 5);  // 设置日期为 2023年10月5日
qDebug() << "设置后的日期是:" << date.toString("yyyy-MM-dd");
4. 日期格式化
QDate date(2023, 10, 5);
qDebug() << "格式化后的日期是:" << date.toString("yyyy-MM-dd");  // 输出: 2023-10-05
qDebug() << "简短日期格式是:" << date.toString("dd/MM/yyyy");  // 输出: 05/10/2023

常用的格式符:

  • d:日(无前导零)
  • dd:日(有前导零)
  • M:月(无前导零)
  • MM:月(有前导零)
  • yy:年(两位数)
  • yyyy:年(四位数)
5. 日期加减操作
QDate date(2023, 10, 5);// 加上 10 天
QDate newDate = date.addDays(10);
qDebug() << "加上10天后的日期是:" << newDate.toString("yyyy-MM-dd");// 减去 1 个月
QDate newDate2 = date.addMonths(-1);
qDebug() << "减去1个月后的日期是:" << newDate2.toString("yyyy-MM-dd");// 加上 2 年
QDate newDate3 = date.addYears(2);
qDebug() << "加上2年后的日期是:" << newDate3.toString("yyyy-MM-dd");
6. 日期比较
QDate date1(2023, 10, 5);
QDate date2(2023, 10, 10);if (date1 < date2) {qDebug() << "date1比date2早";
} else if (date1 > date2) {qDebug() << "date1比date2晚";
} else {qDebug() << "date1和date2是同一天";
}
7. 计算日期间隔
QDate date1(2023, 10, 5);
QDate date2(2023, 10, 10);int days = date1.daysTo(date2);  // 返回两个日期之间的天数
qDebug() << "date1和date2之间相差的天数是:" << days;
8. 判断日期是否有效
QDate date(2023, 2, 30);  // 无效日期,因为2月没有30天
if (!date.isValid()) {qDebug() << "这是一个无效的日期!";
}
9. 获取日期信息
QDate date(2023, 10, 5);
qDebug() << "年份是:" << date.year();  // 输出: 2023
qDebug() << "月份是:" << date.month();  // 输出: 10
qDebug() << "日期是:" << date.day();  // 输出: 5
10. 获取星期几
QDate date(2023, 10, 5);
int dayOfWeek = date.dayOfWeek();  // 返回 1-7,1 表示星期一,7 表示星期日
qDebug() << "这一天是星期" << dayOfWeek;  // 输出: 4 (星期四)
11. 获取一年中的第几天
QDate date(2023, 10, 5);
int dayOfYear = date.dayOfYear();
qDebug() << "这一天是一年中的第" << dayOfYear << "天";  // 输出: 278
12. 获取月份的天数
QDate date(2023, 10, 5);
int daysInMonth = date.daysInMonth();
qDebug() << "这个月有" << daysInMonth << "天";  // 输出: 31
13. 获取一年的天数
QDate date(2023, 10, 5);
int daysInYear = date.daysInYear();
qDebug() << "这一年有" << daysInYear << "天";  // 输出: 365 (2023年不是闰年)
14. 判断是否为闰年
bool isLeapYear = QDate::isLeapYear(2024);
qDebug() << "2024年是闰年吗?" << isLeapYear;  // 输出: true

三、日期时间类:QDateTime

QDateTime 是 Qt 框架中的一个类,用于处理日期和时间的组合。它结合了 QDateQTime 的功能,可以表示某个特定的日期和时间,并提供了许多有用的操作,例如时间戳、时间加减、格式化等。

1. 创建 QDateTime 对象
#include <QDateTime>// 创建一个无效的 QDateTime 对象
QDateTime dateTime;// 创建一个指定日期和时间的 QDateTime 对象 (年, 月, 日, 时, 分, 秒)
QDateTime dateTime1(QDate(2023, 10, 5), QTime(14, 30, 0));  
// 2023年10月5日 14:30:00
2. 获取当前日期和时间
QDateTime currentDateTime = QDateTime::currentDateTime();
qDebug() << "当前日期和时间是:" << currentDateTime.toString("yyyy-MM-dd hh:mm:ss");
3. 设置日期和时间
QDateTime dateTime;
dateTime.setDate(QDate(2023, 10, 5));  // 设置日期为 2023年10月5日
dateTime.setTime(QTime(14, 30, 0));    // 设置时间为 14:30:00
qDebug() << "设置后的日期和时间是:" << dateTime.toString("yyyy-MM-dd hh:mm:ss");
4. 日期和时间格式化
QDateTime dateTime(QDate(2023, 10, 5), QTime(14, 30, 45));
qDebug() << "格式化后的日期和时间是:" << dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz");  
// 输出: 2023-10-05 14:30:45.000qDebug() << "简短日期和时间格式是:" << dateTime.toString("dd/MM/yyyy hh:mm");  
// 输出: 05/10/2023 14:30

常用的格式符:

  • d:日(无前导零)
  • dd:日(有前导零)
  • M:月(无前导零)
  • MM:月(有前导零)
  • yy:年(两位数)
  • yyyy:年(四位数)
  • h:小时(无前导零)
  • hh:小时(有前导零)
  • m:分钟(无前导零)
  • mm:分钟(有前导零)
  • s:秒(无前导零)
  • ss:秒(有前导零)
  • z:毫秒(无前导零)
  • zzz:毫秒(有前导零)
5. 时间加减操作
QDateTime dateTime(QDate(2023, 10, 5), QTime(14, 30, 0));// 加上 10 天
QDateTime newDateTime = dateTime.addDays(10);
qDebug() << "加上10天后的日期和时间是:" << newDateTime.toString("yyyy-MM-dd hh:mm:ss");// 减去 1 个月
QDateTime newDateTime2 = dateTime.addMonths(-1);
qDebug() << "减去1个月后的日期和时间是:" << newDateTime2.toString("yyyy-MM-dd hh:mm:ss");// 加上 90 秒
QDateTime newDateTime3 = dateTime.addSecs(90);
qDebug() << "加上90秒后的日期和时间是:" << newDateTime3.toString("yyyy-MM-dd hh:mm:ss");// 减去 5000 毫秒
QDateTime newDateTime4 = dateTime.addMSecs(-5000);
qDebug() << "减去5000毫秒后的日期和时间是:" << newDateTime4.toString("yyyy-MM-dd hh:mm:ss.zzz");
6. 时间比较
QDateTime dateTime1(QDate(2023, 10, 5), QTime(14, 30, 0));
QDateTime dateTime2(QDate(2023, 10, 5), QTime(15, 0, 0));if (dateTime1 < dateTime2) {qDebug() << "dateTime1比dateTime2早";
} else if (dateTime1 > dateTime2) {qDebug() << "dateTime1比dateTime2晚";
} else {qDebug() << "dateTime1和dateTime2是同一时刻";
}
7. 计算时间间隔
QDateTime dateTime1(QDate(2023, 10, 5), QTime(14, 30, 0));
QDateTime dateTime2(QDate(2023, 10, 5), QTime(15, 0, 0));int secs = dateTime1.secsTo(dateTime2);  // 返回两个时间之间的秒数
qDebug() << "dateTime1和dateTime2之间相差的秒数是:" << secs;qint64 msecs = dateTime1.msecsTo(dateTime2);  // 返回两个时间之间的毫秒数
qDebug() << "dateTime1和dateTime2之间相差的毫秒数是:" << msecs;
8. 判断日期和时间是否有效
QDateTime dateTime(QDate(2023, 2, 30), QTime(14, 30, 0));  
// 无效日期,因为2月没有30天if (!dateTime.isValid()) {qDebug() << "这是一个无效的日期和时间!";
}
9. 获取时间戳
QDateTime dateTime(QDate(2023, 10, 5), QTime(14, 30, 0));
qint64 secsSinceEpoch = dateTime.toSecsSinceEpoch();
qDebug() << "自1970年以来的秒数是:" << secsSinceEpoch;qint64 msecsSinceEpoch = dateTime.toMSecsSinceEpoch();
qDebug() << "自1970年以来的毫秒数是:" << msecsSinceEpoch;
10. 从时间戳创建 QDateTime
qint64 secsSinceEpoch = 1696485000;  // 假设这是某个时间戳
QDateTime dateTime = QDateTime::fromSecsSinceEpoch(secsSinceEpoch);
qDebug() << "从时间戳转换的日期和时间是:" << dateTime.toString("yyyy-MM-dd hh:mm:ss");qint64 msecsSinceEpoch = 1696485000000;  // 假设这是某个时间戳
QDateTime dateTime2 = QDateTime::fromMSecsSinceEpoch(msecsSinceEpoch);
qDebug() << "从毫秒时间戳转换的日期和时间是:" << dateTime2.toString("yyyy-MM-dd hh:mm:ss.zzz");
11. 转换时区
QDateTime dateTime(QDate(2023, 10, 5), QTime(14, 30, 0), QTimeZone::systemTimeZone());// 转换为 UTC 时间
QDateTime utcDateTime = dateTime.toTimeZone(QTimeZone::utc());
qDebug() << "UTC时间是:" << utcDateTime.toString("yyyy-MM-dd hh:mm:ss");// 转换为其他时区,例如东京时间
QDateTime tokyoDateTime = dateTime.toTimeZone(QTimeZone("Asia/Tokyo"));
qDebug() << "东京时间是:" << tokyoDateTime.toString("yyyy-MM-dd hh:mm:ss");
12. 获取日期和时间信息
QDateTime dateTime(QDate(2023, 10, 5), QTime(14, 30, 0));
QDate date = dateTime.date();
QTime time = dateTime.time();qDebug() << "日期是:" << date.toString("yyyy-MM-dd");
qDebug() << "时间是:" << time.toString("hh:mm:ss");

四、时间、日期编辑控件:QDateEdit、QTimeEdit、QDateTimeEdit

在 Qt 中,QDateTimeEditQDateEditQTimeEdit 是用于用户输入和编辑日期和时间的控件。它们分别用于处理日期和时间的不同组合,并且都继承自 QAbstractSpinBox,因此它们的行为类似于其他基于旋钮的控件(如 QSpinBox)。

编程实战,创建一个如下的界面:

1、创建时间编辑器

 

 修改spinBox的后缀

  将这些与时间相关的组件放入一个组,并水平布局

 给这些组件改个名字

槽函数代码:
// 当按钮被点击时,将所有时间、日期相关的控件设置为当前的系统时间和日期
void Dialog::on_pushButton_clicked()
{// 设置开始时间编辑器为当前时间ui->timeEditStart->setTime(QTime::currentTime());// 设置结束时间编辑器为当前时间ui->timeEditEnd->setTime(QTime::currentTime());
}// 当spinBoxTime的值发生变化时,根据变化的小时数调整结束时间
void Dialog::on_spinBoxTime_valueChanged(int arg1)
{// 获取开始时间,并加上spinBoxTime中设置的小时数(转换为秒)QTime time = ui->timeEditStart->time().addSecs(arg1 * 3600);// 将计算后的时间设置到结束时间编辑器ui->timeEditEnd->setTime(time);
}

2、 创建日期编辑器

 跟创建时间编辑器的步骤类似,节约时间,直接给你们看结果(记得改名字

 槽函数代码:

// 当按钮被点击时,将所有时间、日期相关的控件设置为当前的系统时间和日期
void Dialog::on_pushButton_clicked()
{// 设置开始时间编辑器为当前时间ui->timeEditStart->setTime(QTime::currentTime());// 设置结束时间编辑器为当前时间ui->timeEditEnd->setTime(QTime::currentTime());// 设置开始日期编辑器为当前日期ui->dateEditStart->setDate(QDate::currentDate());// 设置结束日期编辑器为当前日期ui->dateEditEnd->setDate(QDate::currentDate());
}// 当spinBoxTime的值发生变化时,根据变化的小时数调整结束时间
void Dialog::on_spinBoxTime_valueChanged(int arg1)
{// 获取开始时间,并加上spinBoxTime中设置的小时数(转换为秒)QTime time = ui->timeEditStart->time().addSecs(arg1 * 3600);// 将计算后的时间设置到结束时间编辑器ui->timeEditEnd->setTime(time);
}// 当spinBoxDate的值发生变化时,根据变化的天数调整结束日期
void Dialog::on_spinBoxDate_valueChanged(int arg1)
{// 获取开始日期,并加上spinBoxDate中设置的天数QDate date = ui->dateEditStart->date().addDays(arg1);// 将计算后的日期设置到结束日期编辑器ui->dateEditEnd->setDate(date);
}

3、日期时间编辑器

创建一个如下的界面

 槽函数代码:
// 当按钮被点击时,将所有时间、日期相关的控件设置为当前的系统时间和日期
void Dialog::on_pushButton_clicked()
{// 设置开始时间编辑器为当前时间ui->timeEditStart->setTime(QTime::currentTime());// 设置结束时间编辑器为当前时间ui->timeEditEnd->setTime(QTime::currentTime());// 设置开始日期编辑器为当前日期ui->dateEditStart->setDate(QDate::currentDate());// 设置结束日期编辑器为当前日期ui->dateEditEnd->setDate(QDate::currentDate());// 设置开始日期时间编辑器的日期为当前日期ui->dateTimeEditStart->setDate(QDate::currentDate());// 设置开始日期时间编辑器的时间为当前时间ui->dateTimeEditStart->setTime(QTime::currentTime());// 设置结束日期时间编辑器的日期为当前日期ui->dateTimeEditEnd->setDate(QDate::currentDate());// 设置结束日期时间编辑器的时间为当前时间ui->dateTimeEditEnd->setTime(QTime::currentTime());
}// 当spinBoxTime的值发生变化时,根据变化的小时数调整结束时间
void Dialog::on_spinBoxTime_valueChanged(int arg1)
{// 获取开始时间,并加上spinBoxTime中设置的小时数(转换为秒)QTime time = ui->timeEditStart->time().addSecs(arg1 * 3600);// 将计算后的时间设置到结束时间编辑器ui->timeEditEnd->setTime(time);
}// 当spinBoxDate的值发生变化时,根据变化的天数调整结束日期
void Dialog::on_spinBoxDate_valueChanged(int arg1)
{// 获取开始日期,并加上spinBoxDate中设置的天数QDate date = ui->dateEditStart->date().addDays(arg1);// 将计算后的日期设置到结束日期编辑器ui->dateEditEnd->setDate(date);
}// 当spinBoxDays的值发生变化时,根据变化的天数调整结束日期时间的日期部分
void Dialog::on_spinBoxDays_valueChanged(int arg1)
{// 获取开始日期时间的日期部分,并加上spinBoxDays中设置的天数QDate date = ui->dateTimeEditStart->date().addDays(arg1);// 将计算后的日期设置到结束日期时间编辑器的日期部分ui->dateTimeEditEnd->setDate(date);
}

4、运行结果


五、日历控件:QCalendarWidget

QCalendarWidget 是 Qt 框架中的一个 GUI 组件,用于显示和选择日期。它提供了一个直观的月历界面,用户可以通过点击选择日期,并支持多种自定义功能,例如设置日期范围、高亮特定日期、更改外观样式等。

1.、基本功能

QCalendarWidget 提供以下核心功能:

  • 显示日历 :以月为单位显示日期,默认显示当前月份。
  • 日期选择 :用户可以通过鼠标点击选择某个日期。
  • 导航功能 :允许用户切换月份或年份。
  • 日期范围限制 :可以设置可选日期的最小值和最大值。
  • 高亮特定日期 :支持标记某些日期(如节假日或重要事件)。
  • 国际化支持 :支持不同语言和地区的时间格式。
2、先做出如下的页面

3、常用信号

QCalendarWidget 提供了几个常用的信号,用于响应用户的操作。例如:

  • selectionChanged() :当用户选择的日期发生变化时触发。
  • currentPageChanged(int year, int month) :当用户切换月份或年份时触发。
4、生成槽函数 

5、槽函数代码
void Dialog::on_calendarWidget_selectionChanged()
{auto date =ui->calendarWidget->selectedDate();QString str = date.toString("yyyy年M月d日");ui->dateEdit->setDate(date);ui->lineEdit->setText(str);
}
 6、运行结果


 六、定时器:Timer

QTimer 是 Qt 框架中的一个类,用于在应用程序中实现定时器功能。它允许开发者以指定的时间间隔执行某些操作,例如定期更新界面、处理后台任务或触发事件。

1、创建一个如下的界面

 更改一下进度条的值为0

 

 2、什么是TimerType
  • 类型 Qt::TimerType
  • 描述 :定时器的精度类型,决定定时器的触发精度。
  • 可选值
    • Qt::VeryCoarseTimer:非常低精度的定时器,通常以秒为单位触发。
    • Qt::CoarseTimer:低精度定时器,允许操作系统优化触发时间。
    • Qt::PreciseTimer:高精度定时器,尽可能精确地触发。毫秒级
  • 默认值 Qt::CoarseTimer
timer->setTimerType(Qt::PreciseTimer); // 设置为高精度定时器
 3、dialog.h的代码
#ifndef DIALOG_H
#define DIALOG_H#include <QDialog>  // 包含 QDialog 类,用于创建对话框窗口
#include <QTimer>   // 包含 QTimer 类,用于定时器功能QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }  // 声明 UI 命名空间,用于管理 UI 文件生成的类
QT_END_NAMESPACEclass Dialog : public QDialog
{Q_OBJECT  // 宏定义,允许使用 Qt 的信号与槽机制public:Dialog(QWidget *parent = nullptr);  // 构造函数,初始化对话框~Dialog();                          // 析构函数,释放资源private slots:void on_timer_timeout();            // 定时器超时时触发的槽函数void on_pushButtonStart_clicked(); // 开始按钮点击时触发的槽函数void on_pushButtonStop_clicked();  // 停止按钮点击时触发的槽函数private:void initUi();                      // 初始化界面和组件Ui::Dialog *ui;                     // 指向由 Qt Designer 生成的 UI 对象QTimer* m_timer;                    // 定时器对象,用于计时功能long timeGo;                        // 记录已用时间(秒)
};#endif // DIALOG_H
4、dialog.cpp的代码
#include "dialog.h"      
#include "ui_dialog.h"   // 构造函数,初始化对话框
Dialog::Dialog(QWidget *parent): QDialog(parent)    , ui(new Ui::Dialog) 
{ui->setupUi(this);   // 设置 UI 界面timeGo = 0;          // 初始化计时器时间为 0 秒ui->label->setText("已用时:0秒"); // 设置标签初始文本initUi();            // 初始化界面和组件
}Dialog::~Dialog()
{delete ui;           
}// 定时器超时时触发的槽函数
void Dialog::on_timer_timeout()
{timeGo++;            // 每次超时增加 1 秒QString str = "已用时:"; // 构造显示字符串str.append(QString::number(timeGo) + "秒"); // 将秒数转换为字符串并拼接ui->label->setText(str); // 更新标签显示内容int value = ui->progressBar->value() + 1; // 获取进度条当前值并加 1if (value > 100) value = 0;               // 如果超过 100,则重置为 0ui->progressBar->setValue(value);         // 更新进度条值
}// 初始化界面和组件
void Dialog::initUi()
{m_timer = new QTimer(this);              // 创建定时器对象m_timer->setTimerType(Qt::PreciseTimer); // 设置定时器类型为高精度m_timer->setInterval(1000);              // 设置定时器间隔为 1000 毫秒(1 秒)connect(m_timer, SIGNAL(timeout()),      // 连接定时器的 timeout 信号this, SLOT(on_timer_timeout())); // 到槽函数 on_timer_timeout
}// 开始按钮点击时触发的槽函数
void Dialog::on_pushButtonStart_clicked()
{m_timer->start(); // 启动定时器
}// 停止按钮点击时触发的槽函数
void Dialog::on_pushButtonStop_clicked()
{m_timer->stop();  // 停止定时器
}
5、运行结果

相关文章:

QT基础八、与时间相关的UI控件

目录 一、时间类&#xff1a;QTime 1. 创建 QTime 对象 2. 获取当前时间 3. 设置时间 4. 时间格式化 5. 时间加减操作 6. 时间比较 7. 计算时间间隔 8. 判断时间是否有效 9. 使用 QElapsedTimer 测量时间间隔 二、日期类&#xff1a;QDate 1. 创建 QDate 对象 2. 获…...

大道至简 少字全意 易经的方式看 缓存 mybatis缓存 rendis缓存场景 案例

目录 介绍 mybatis缓存 一级缓存 1.是什么 2.特点 3.场景 mybatis 二级缓存 1.是什么 2.特点 3.配置步骤 注意 一级缓存问题 二级缓存问题 扩展 1.MyBatis集成 Redis 2.直接使用Redis redis 缓存 一、String 字符串 二、Llst 列表 三、Hash 哈希 四、Set…...

Python爬虫selenium验证-中文识别点选+图片验证码案例

1.获取图片 import re import time import ddddocr import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium.webdriver.support.wait import WebDriverWait from …...

设计模式Python版 中介者模式

文章目录 前言一、中介者模式二、中介者模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组…...

docker-compose Install deepseek

前言 deepseekAI助手。它具有聊天机器人功能&#xff0c;可以与用户进行自然语言交互&#xff0c;回答问题、提供建议和帮助解决问题。DeepSeek 的特点包括&#xff1a; 强大的语言理解能力&#xff1a;能够理解和生成自然语言&#xff0c;与用户进行流畅的对话。多领域知识&…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options

ngx_process_options 声明在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle); 定义在 src\core\nginx.c static ngx_int_t ngx_process_options(ngx_cycle_t *cycle) {u_char *p;size_t len;if (ngx_prefix) {len ngx_strlen(ngx_prefix);p …...

vue:vite 代理服务器 proxy 配置

Vite 代理服务器&#xff08;Proxy&#xff09;的配置通常用于开发环境&#xff0c;以解决跨域请求等问题。以下是一个详细的配置步骤&#xff1a; 通过以上步骤&#xff0c;你就可以在 Vite 项目中配置代理服务器&#xff0c;以便在开发过程中方便地访问后端服务。 ‌找到 Vi…...

【数据结构】快指针和慢指针

一、 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。 要求&#xff1a;只遍历一遍链表 可以使用快慢指针&#xff1a;fast 一次走两步&#xff0c;slow 一次走一步。当 fast NULL&#xff08;偶数个结点&#xff09;或…...

初级渗透测试工程师需要学什么?网络安全零基础入门到精通教程建议收藏!

1、前言 本文主要介绍如何成为一名初级的渗透测试工程师所需要学习的内容&#xff0c;后续也会基于此将自己的学习总结、心得记录下来。相信在不断坚持下&#xff0c;争取在今年五月初成为一名初级的渗透测试工程师。 2、涉及知识领域 基础网络知识&#xff1a; 理解TCP/IP协…...

WSL2下ubuntu开启NFS服务

1. wsl2下ubuntu配置 安装 NFS 服务&#xff1a; sudo apt-get install nfs-kernel-server rpcbindnfs 配置文件/etc/exports&#xff1a; sudo vi /etc/exports打开/etc/exports 以后在后面添加如下所示内容&#xff1a; /home/mk/nfs *(rw,sync,no_subtree_check,no_root…...

superset

开源的BI工具还是选择apache的superset&#xff0c;2021年的是用过davince&#xff0c;结果2023年就不维护了&#xff0c;dataart也是一样的到2023年也没人维护了&#xff0c;dataease国产的人家也要吃饭&#xff0c;社区版也有限制。因而选择用python开发的superset成了唯一的…...

CSS通过webkit-scrollbar设置滚动条样式

查看::-webkit-scrollbar-*各项关系 以下图为例&#xff0c;可以分别定义滚动条背景、滚动轨道、滚动滑块的样式。 需要先给外部容器设置高度&#xff0c;再设置overflow: auto&#xff0c;最后设置三个webkit属性。 <!DOCTYPE html> <html lang"en">…...

Mac下Python版本管理,适用于pyenv不起作用的情况

前言 声明&#xff1a;之前也在网上看到过可以使用pyenv来管理python版本&#xff0c;但由于作者的python安装路径实在是繁杂不堪&#xff0c;因此安装完成pyenv体验下来没有任何用处&#xff0c;但偶然发现vscode似乎可以看到各个python版本&#xff0c;因此写下这篇博客记录…...

基于SpringBoot+mybatisplus+vueJS的Cosplay文化展示与交流社区设计与实现

博主介绍&#xff1a;硕士研究生&#xff0c;专注于信息化技术领域开发与管理&#xff0c;会使用java、标准c/c等开发语言&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架…...

Linux动静态库

铺垫 1.动态库与静态库本质上都是文件。 2.关于动静态链接 动态链接&#xff1a;将库中需要的函数地址&#xff0c;填入可执行程序&#xff0c;建立关联。 优点&#xff1a;节省资源&#xff0c;不会出现太多重复代码。 缺点&#xff1a;对库的依赖性比较强&#xff0c;一…...

区块链中的数字签名:安全性与可信度的核心

数字签名是区块链技术的信任基石&#xff0c;它像区块链世界的身份证和防伪标签&#xff0c;确保每一笔交易的真实性、完整性和不可抵赖性。本文会用通俗的语言&#xff0c;带你彻底搞懂区块链中的数字签名&#xff01; 文章目录 1. 数字签名是什么&#xff1f;从现实世界到区块…...

Java实现斗地主-做牌以及对牌排序

卡牌类 public class Card {private String size;//大小private String color;//花色private int value;//权值public Card() {}public Card(String size, String color, int value) {this.size size;this.color color;this.value value;}public String toString(){return …...

SQL写法技巧

目录 1.批量插入&#xff0c;查询&#xff0c;删除数据 缺点 实现方法 1.批量插入数据 2.批量查询数据 3.批量删除数据 4.批量修改数据 解释 2.树型表查询 方法一&#xff1a;递归(适用于多级的情况) 方法二&#xff1a;表的自连接 方法三&#xff1a;MySQL递归&am…...

`pip freeze > requirements.txt` 命令

pip freeze > requirements.txt 命令的作用是将当前 Python 环境中已安装的所有包及其版本号导出到一个名为 requirements.txt 的文件中。这个文件通常用于记录项目的依赖包&#xff0c;以便在其他环境中快速安装相同的依赖。 ### 具体作用 1. **生成依赖列表**&#xff1a…...

windows安装pytorch

windows安装pytorch 通过pip来安装pytorch. 1、更新pip 在激活的虚拟环境中&#xff0c;输入命令&#xff1a; python -m pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple/2、安装cpu版的pytorch pip3 install torch torchvision torchaudio -i http…...

计算机网络之路由协议(自治系统)

一、自治系统&#xff08;AS&#xff09; 自治系统是由同一个技术管理机构管理、使用统一选路策略的一些路由器的集合。它是网络的基本构成单位&#xff0c;每个自治系统是一个独立运营并自主决定与谁交换流量的实体。自治系统内部运行内部网关协议&#xff08;IGP&#xff09…...

unity获取指定麦克风的分贝(deepseek)

在Unity中&#xff0c;获取指定麦克风的分贝值需要使用Microphone类来捕获麦克风输入&#xff0c;并通过AudioSource或直接处理音频数据来计算分贝值。以下是实现步骤和示例代码&#xff1a; 实现步骤&#xff1a; 1、初始化麦克风&#xff1a;使用Microphone.Start开始录制麦…...

Spring5框架八:整合Mybatis

精心整理了最新的面试资料&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 1、导入相关的jar包 <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --><dependency><groupId>…...

从人机环境系统智能角度看传统IP的全球化二次创作法则

从人机环境系统智能的视角看&#xff0c;传统IP的全球化二次创作法则需结合技术、文化、伦理与环境的复杂协同。这一过程不仅是内容的本土化改编&#xff0c;更是人、机器与环境在动态交互中实现价值共创的体现。 一、人机环境系统智能的底层逻辑与IP二次创作的融合 1、感知层&…...

《论软件的可靠性评价》审题技巧 - 系统架构设计师

论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节&#xff0c;是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容&#xff1a; 首先&#xff0c;本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…...

基于数据可视化学习的卡路里消耗预测分析

数据分析实操集合&#xff1a; 1、关于房间传感器监测数据集的探索 2、EEMD-LSTM模型择时策略 — 1.EEMD分解与LSTM模型搭建 3、EEMD-LSTM模型择时策略 — 2. 量化回测 4、国际超市电商销售数据分析 5、基于问卷调查数据的多元统计数据分析与预测&#xff08;因子分析、对应分…...

毕业项目推荐:基于yolov8/yolov5/yolo11的果蔬检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…...

Graspness Discovery in Clutters for Fast and Accurate Grasp Detection 解读

研究背景 研究问题 &#xff1a;这篇文章要解决的问题是如何在杂乱的环境中快速且准确地检测抓取姿态。传统的 6自由度抓取方法将场景中的所有点视为平等&#xff0c;并采用均匀采样来选择抓取候选点&#xff0c;但忽略了抓取位置的重要性&#xff0c;这极大地影响了抓取姿态检…...

Redission可重试、超时续约的实现原理(源码分析)

Redission遇到其他进程已经占用资源的时候会在指定时间waitTime内进行重试。实现过程如下&#xff1a; 执行获取锁的lua脚本时&#xff0c;会返回一个值&#xff0c; 如果获取锁成功&#xff0c;返回nil&#xff0c;也就是java里的null 如果获取锁失败&#xff0c;用语句“PT…...

vscode 配置 Copilot 提示GHE.com连接失败

步骤一&#xff1a;打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接&#xff0c;这会打开 settings.json 文件。 步骤二&#…...

红队内网攻防渗透:内网渗透之内网对抗:实战项目VPC1打靶PHP-RCE三层代理路由防火墙上线密码喷射域控提权

红队内网攻防渗透 实战网络攻防靶场记录1.靶机配置详情讲解1.1 入口点靶机:Windows Server 20121.2 第一层靶机:Windows 7 + Windows 101.3 第二层靶机:Windows 2012 R21.4 第三层靶机:Windows 2016 web +Windows 2016 AD域1.5 攻击者系统 :Kali-linux2.靶场渗透完整流程2…...

四、综合案例(Unity2D)

一、2D渲染 1、2D相机基本设置 上面是透视&#xff0c;下面是正交 2、图片资源 在Unity中&#xff0c;常规图片导入之后&#xff0c;一般不在Unity中直接使用&#xff0c;而是转为精灵图Sprite 将图片更改为即可使用Unity内置的图片切割功能 无论精灵图片是单个的还是多个的…...

50周学习go语言:第1周 环境搭建

以下是为零基础学习者准备的详细第1周教程&#xff0c;包含环境搭建、工具配置和首个Go程序的完整操作指南&#xff1a; 一、Go语言环境安装&#xff08;Windows/macOS/Linux通用&#xff09; 1. 下载安装包 官网地址&#xff1a;https://go.dev/dl//根据系统选择对应版本&am…...

Docker Desktop 入门教学

引言 Docker Desktop 是 Docker 官方为开发者提供的桌面应用程序&#xff0c;支持在 Windows 和 macOS 上轻松构建、运行和共享容器化应用程序。它集成了 Docker 引擎、Docker CLI 客户端以及 Docker Compose 等工具&#xff0c;方便您在本地开发和测试。 一、快速安装 1. 系…...

BOOST电路设计

目录 1电路模型 2器件选型 2.1设计需求 2.2参数计算 2.2.1电感L计算 2.2.2电容计算 2.2.3电阻计算 3仿真测试 4参数测试 4.1负载调整率 4.2电容测试 4.3电感测试 5实际应用 1电路模型 Boost升压电路,可以工作在电流断续工作模式(DCM)和电流连续工作模式(CCM)。CCM工…...

Qt常用控件之标签QLabel

标签QLabel QLabel 标签用来显示文本和图片&#xff0c;在 Qt 中使用频率很高。 1. Label属性 属性说明textQLabel 中的文本。textFormat文本的格式。其中 Qt::PlainText 为纯文本&#xff1b;Qt::RichText 为富文本&#xff08;支持 html 格式&#xff09;&#xff1b; Qt:…...

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

网络安全知识--网络、网络安全产品及密码产品概述

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网络结构 网络设备&#xff1a;交换机、路由器、负载均衡 安全设备&#xff1a; 通信网络安全类:通信安全、网络监测与控制 区域边界安全类&#xff1a;隔离类…...

【mysql中mvcc的含义和作用及原理】

MySQL中的MVCC&#xff08;多版本并发控制&#xff09;是一种用于提高数据库并发性能的机制&#xff0c;通过维护数据的多个版本&#xff0c;实现读写操作的无锁并发。以下是其核心要点&#xff1a; 1. MVCC的含义 全称&#xff1a;Multi-Version Concurrency Control&#xf…...

【Android】Android 悬浮窗开发 ( 动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

文章目录 一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后返回处理 二、悬浮窗 前台服务和通知1、前台服务 启动 悬浮窗 的必要性① 保持悬浮窗存活② 悬浮窗的要求③ 悬浮窗版本兼容 2、其它类型服务简介① 前台服务…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Live View Kit (1)

1.问题描述&#xff1a; 客户端创建实况窗后&#xff0c;通过Push kit更新实况窗内容&#xff0c;这个过程是自动更新的还是客户端解析push消息数据后填充数据更新&#xff1f;客户端除了接入Push kit和创建实况窗还需要做什么工作&#xff1f; 解决方案&#xff1a; 通过Pu…...

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …...

java实现多图合并加字和画框等

java实现多图合并加字和画框等 在wutool中&#xff0c;封装了图片处理工具类&#xff0c;基于java自带的BufferedImage类&#xff0c;实现多图合并和加字、图片画框等。 关于wutool wutool是一个java代码片段收集库&#xff0c;针对特定场景提供轻量解决方案&#xff0c;只要…...

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票

腾讯SQL面试题解析:如何找出连续5天涨幅超过5%的股票 作者:某七年数据开发工程师 | 2025年02月23日 关键词:SQL窗口函数、连续问题、股票分析、腾讯面试题 一、问题背景与难点拆解 在股票量化分析场景中,"连续N天满足条件"是高频面试题类型。本题要求在单表stoc…...

Elasticsearch 自动补全搜索 - autocomplete

作者&#xff1a;来自 Elastic Amit Khandelwal 探索处理自动完成的不同方法&#xff0c;从基础到高级&#xff0c;包括输入时搜索、查询时间、完成建议器和索引时间。 在本文中&#xff0c;我们将介绍如何避免严重的性能错误、Elasticsearch 默认解决方案为何不适用以及重要的…...

大屏自适应终极方案:基于比例缩放的完美适配实践(Vue3版)

需求背景 在数据可视化大屏开发中&#xff0c;我们常面临这样的挑战&#xff1a;如何让1920*1080的设计稿在不同分辨率设备上完美呈现&#xff1f;传统的响应式布局难以应对复杂的大屏元素排布&#xff0c;本文介绍一种基于CSS3变换的终极适配方案 实现思路 本方案的核心是动…...

云计算中的API网关是什么?为什么它很重要?

在云计算架构中&#xff0c;API网关&#xff08;API Gateway&#xff09;是一个重要的组件&#xff0c;主要用于管理、保护和优化不同服务之间的接口&#xff08;API&#xff09;通信。简单来说&#xff0c;API网关就像是一个中介&#xff0c;它充当客户端和后端服务之间的“桥…...

前端ES面试题及参考答案

目录 let/const 与 var 的区别?TDZ 是什么? 箭头函数与普通函数的区别?箭头函数能否作为构造函数? 模板字符串的嵌套表达式和标签模板用法? 解构赋值的应用场景及对象 / 数组解构差异? 函数参数默认值的生效条件及暂时性死区问题? 展开运算符(...)在数组 / 对象中…...

【架构思维基础:如何科学定义问题】

架构思维基础&#xff1a;如何科学定义问题 一、问题本质认知 1.1 问题矛盾 根据毛泽东《矛盾论》&#xff0c;问题本质是系统内部要素间既对立又统一的关系。例如&#xff1a; 电商系统矛盾演变&#xff1a; 90年代&#xff1a;商品供给不足 vs 消费需求增长00年代&#x…...

【网络安全】常见的web攻击

1、SQL注入攻击 定义&#xff1a; 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;当服务器利用参数构建SQL语句的时候&#xff0c;恶意的SQL代码被一起构建,并在数据库中执行。 示例&#xff1a; 用户登录&#xff1a; 输入用户名xx&#xff0c; 密码 or 1 …...