一、日期时间数据
1.QTime
用于存储和操作时间数据的类,其中包括小时(h)、分钟(m)、秒(s)、毫秒(ms)。函数定义如下:
//注:秒(s)和毫秒(ms)有默认值0
QTime::QTime(int h, int m, int s = 0, int ms = 0)
若无须初始化时间数据,可以使用静态函数 QTime::currentTime() 来创建一个QTime对象,并获取当前时间:
QTime time = QTime::currentTime();
在通常情况下,我们直接获取当前时间即可,如需修改当前时间可直接使用setHMS方法。因此后文将不再介绍使用函数定义的方法操作时间数据。
在默认情况下,QTime总是使用24小时制,不区分AM/PM。那么我们想要用到12小时制时该怎么处理时间数据呢?这里需要用到一个函数 toString() 来格式化时间(后文有介绍)。
int hour() | 返回当前小时数据 |
int minute() | 返回当前分钟数据 |
int second() | 返回当前秒数据 |
int msec() | 返回当前毫秒数据 |
bool setHMS(int h, int m, int s, int ms = 0) | 设置时间 |
int msecsSinceStartOfDay() | 返回从00:00:00开始的毫秒数 |
QTime addSecs(int s) | 返回当前±s秒后的时间 |
int secsTo(QTime t) | 返回当前时间与t相差的秒数 |
2.QDate
用于存储和操作日期数据的类,其中包含年、月、日数据。同样也可使用 QDate::currentDate() 来获取当前日期。
当然说到日期,其中一个避不开的话题就是判断闰年。这里Qt直接给了一个静态函数方便判断哪一年是否为闰年:
bool QDate::isLeapYear(int year)
int year() | 返回当前日期的年数据 |
int month() | 返回当前日期的月数据 |
int day() | 返回当前日期的日数据 |
int dayOfWeek() | 返回星期几 |
bool setDate(int year, int month, int day) | 设置日期 |
bool getDate(int *year, int *month, int *day) | 获取日期 |
QDate addDays(int ndays) | 返回当前日期再加几天的日期 |
qint64 daysTo(QDate d) | 返回与日期d的间隔天数 |
3.QDateTime
表示日期数据和时间数据的类。可通过如下方式获取日期和时间:
QDateTime dateTime = QDateTime::currentDateTime();
QDate dateTime = DT1.date(); //获取日期
QTime dateTime = DT1.time(); //获取时间
qint64 toSecsSinceEpoch() | 返回与1970年1月1日相差的秒数 |
void setSecsSinceEpoch(qint64 secs) | 设置与1970年1月1日相差的秒数为当前的日期数据 |
QdateTime toUTC() | 将当前时间转换为UTC数据 |
注:UTC(协调世界时,Coordinated Universal Time)是世界上时间的标准,它不受时区影响,并且基于原子钟的精确计时。UTC时间是一种时间标准,用于全球的时钟和时间信号。
4.格式化日期时间数据
QTime、QDate、QDateTime都有格式化数据方法 toString() 和 fromString()。
a.toString()
将当前的日期时间数据转换为字符串。函数原型定义如下:
QString QDateTime::toString(const QString &format)
format为转化后的格式,Qt提供了一些预定义的格式可以直接使用。常用的为:Qt::TextDate、Qt::ISODate、Qt::SystemLocaleShortDate(Qt6已被移除)等。当然也可以使用一些自定义格式,例如:
- yyyy:四位数的年份
- MM:两位数的月份(01-12)
- dd:两位数的日期(01-31)
- hh:两位数的小时(00-23)
- mm:两位数的分钟(00-59)
- ss:两位数的秒(00-59)
- zzz:三位数的毫秒(000-999)
- AP或A:使用AM/PM表示,即从24小时制转化为12小时制
注:在上面的格式中,如果只写一位,如‘d’,则表示不补零显示(1-31)而非(01-31)。 举例:
QDateTime dateTime = QDateTime::currentDateTime();
qDebug() << "TextDate format:" << dateTime.toString(Qt::TextDate);
qDebug() << "ISODate format:" << dateTime.toString(Qt::ISODate);
qDebug() << "Custom format:" << dateTime.toString("yyyy-MM-dd hh:mm:ss.zzz AP");
其输出结果为:
b.fromString()
将字符串转化为相应类的对象。其函数原型如下:
QDateTime QDateTime::fromString(const QString &string, const QString &format)
举个例子:
QString dateTimeString = "2024-07-02 14:30:45.123";
QDateTime dateTime1 = QDateTime::fromString(dateTimeString, Qt::ISODate);
QDateTime dateTime2 = QDateTime::fromString(dateTimeString, "yyyy-MM-dd hh:mm:ss.zzz");
qDebug() << "DateTime1:" << dateTime1.toString();
qDebug() << "DateTime2:" << dateTime2.toString();
输出结果为:
5.界面组件
具体在创建界面时,可拖动如图所示组件实现:
二、定时器
1.QTimer
QTimer的父类为QObject,支持Qt的元对象系统。因此虽然它不是一个界面组件类,但是它也有属性、信号(timeout())和槽(start()、stop()、自定义等)。其主要属性如下:
属性 | 类型 | 功能 |
---|---|---|
interval | int | 定时周期,单位ms |
singleShot | bool | true表示单次定时 |
timerType | Qt::TimerType | 精度类型。分为精确、粗糙、非常粗糙 |
active | bool | ture表示定时器正在运行 |
a.timeout()信号
当定时器通过 start() 启动后,每当定时溢出一次(定时周期到了),QTimer就会发射一个 timeout() 信号。如果是连续定时,QTimer就会发射多次 timeout() 信号。举个例子:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QTimer *m_timer = new QTimer(this); //创建定时器,需要动态分配内存
m_timer->stop(); //先停止定时器
m_timer->setTimerType(Qt::CoarseTimer); //设置定时器精度等级:粗糙,误差不超过整个周期的5%
m_timer->setInterval(3000); //设置定时器的周期为3s
m_timer->setSingleShot(true); //设置单次定时
connect(m_timer,SIGNAL(timeout()),this,SLOT(do_timer_timeout())); //关联定时器的信号与槽
}
//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{
QApplication::beep(); //定时溢出时,系统的蜂鸣器发声
}
//“开始”按钮来启动定时器
void Widget::on_btnStart_clicked()
{
m_timer->start(); //启动定时器,m_timer为QTimer类
}
那么当点击开始按钮后,在3s后就会听到系统的蜂鸣声。
b.静态函数singleShot()
这个函数用来创建和启动单次定时器,并且将定时器的timeout()信号与指定槽函数关联。也就是说,如果只是定时一次,那么就无须繁琐的设置,也无须启动,随调随用。函数定义如下:
void QTimer::singleShot(int msec, Qt::TimerType timerType, const QObject *reveiver, const char *member)
那么上面的例子就可以这样改写:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
}
//与定时器的timeout()信号关联的槽函数
void Widget::do_timer_timeout()
{
QApplication::beep(); //定时溢出时,系统的蜂鸣器发声
}
//动态创建单次定时器
void Widget::on_btnOneShot_clicked()
{
QTimer::singleShot(3000,Qt::CoarseTimer,this,&Widget::do_timer_timeout);
}
2.QElapsedTimer
这个类用于快速计算两个事件的间隔时间。与QTimer不同的是,它没有父类,不支持Qt的元对象系统,所以只有一些简单的接口函数。使用起来也比较简单,举个例子即可快速了解:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
QElapsedTimer m_counter; // 创建计时器
m_counter.start(); //启动计时器,注意这里没有stop()方法
}
//停止计时
void Widget::on_btnStop_clicked()
{
int tmMsec=m_counter.elapsed(); //毫秒数
int ms= tmMsec % 1000; //余数毫秒
int sec=tmMsec/1000; //整秒
QString str=QString("流逝的时间:%1秒,%2毫秒").arg(sec).arg(ms,3,10,QChar('0'));
qDebug() << "Elapsed time:" << str;
}
点击停止按钮后可看到输出框的结果为:
以上就是关于Qt中关于时间日期数据的一些总结。虽查阅大量资料,可能仍有部分错误,望读者不吝赐教。