QT--多页面、定时器和日期时间数据

多页面

  1. widget.ui 负责实现一个页面; mian.cpp创建窗体对象,并监控上面的事件

  2. 窗口的显示和隐藏:

    一个窗体,比如logpage widget,继承QWidget

    QWidget::show(); 显示该窗体

    QWidget::hide(); 隐藏该窗体

  3. 页面间通信采用在main.cpp 中创建connect槽函数。

  4. 代码如下

cpp 复制代码
//main.cpp
#include "widget.h"
#include "vice_form.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    vice_form vice;

    QObject::connect(&w,SIGNAL(logSuccessVistVice_formSignal(QString&,QString&)),
                     &vice,SLOT(wlogSuccessVistVice_formSignalToSlot(QString&,QString&)));
    QObject::connect(&vice,SIGNAL(vice_formReturnWidgetSiganl()),&w,
                     SLOT(vice_formReturnWidgetSiganlSlotFun()));
    w.show();
    return a.exec();
}


//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void btnLogClickedSlotFun();
    void vice_formReturnWidgetSiganlSlotFun();
signals:
    void logSuccessVistVice_formSignal(QString&,QString&);
private:
    Ui::Widget *ui;

};
#endif // WIDGET_H


//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDialog>
#include<QMessageBox>
#include "vice_form.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->move(600,300);

    ui->lineName->setPlaceholderText("请输入姓名");
    ui->linePasswd->setPlaceholderText("请输入密码");
    ui->linePasswd->setEchoMode(QLineEdit::Password);

    ui->btnLog->setText("登录");
    connect(ui->btnLog,SIGNAL(clicked()),this,SLOT(btnLogClickedSlotFun()));
}

Widget::~Widget()
{
    delete ui;
}

void Widget::btnLogClickedSlotFun()
{
    QString name = ui->lineName->text();
    QString passwd=ui->linePasswd->text();


    this->hide();
    emit logSuccessVistVice_formSignal(name,passwd);

}

void Widget::vice_formReturnWidgetSiganlSlotFun()
{
    this->show();

}

//vice_form.h
#ifndef VICE_FORM_H
#define VICE_FORM_H

#include <QWidget>

namespace Ui {
class vice_form;
}

class vice_form : public QWidget
{
    Q_OBJECT

public:
    explicit vice_form(QWidget *parent = nullptr);
    ~vice_form();
signals:
    void vice_formReturnWidgetSiganl();
public slots:
    void wlogSuccessVistVice_formSignalToSlot(QString&,QString&);

private:
    Ui::vice_form *ui;
};

#endif // VICE_FORM_H

//vice_form.cpp
#include "vice_form.h"
#include "ui_vice_form.h"
#include<QMessageBox>
vice_form::vice_form(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::vice_form)
{
    ui->setupUi(this);
}

vice_form::~vice_form()
{
    delete ui;
}

void vice_form::wlogSuccessVistVice_formSignalToSlot(QString &name, QString &passwd)
{
    if(name!="xiaowang"){
        //QMessageBox::StandardButton btn;//根据btn的值进行后续操作
        QMessageBox::information(this,"提醒","姓名不对喔",
                                 QMessageBox::Yes|QMessageBox::No);
    emit vice_formReturnWidgetSiganl();
    return;
    }
    if(passwd!="123456"){
        //QMessageBox::StandardButton btn;//根据btn的值进行后续操作
        QMessageBox::information(this,"提醒","密码不对喔",
                                 QMessageBox::Yes|QMessageBox::No);
    emit vice_formReturnWidgetSiganl();
    return;
    }
    this->show();
}

定时器QTimer

  1. QTimer 是软件定时器,其父类是QObject。QTimer 的主要功能是设置以毫秒 为单位的定时周期,然后进行连续定时单次定时 。启动定时器后,定时溢出时QTimer会发射timeout()
    信号,为timeout()信号关联槽函数就可以进行定时处理。
  2. 常用方法
函数 含义
start(int msec) 启动定时器,定时器会在每个 msec 毫秒后发出一次 timeout 信号。
stop() 停止定时器。
setInterval(int msec) 设置定时器的时间间隔为 msec 毫秒。
isActive() 检查定时器是否正在运行。
  1. 代码举例
cpp 复制代码
//widget.h
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void timeoutSlotFun();

private:
    Ui::Widget *ui;
    QTimer timer;
};
#endif // WIDGET_H



//widget.cpp
#include "widget.h"
#include "ui_widget.h"

// Widget 类的构造函数
Widget::Widget(QWidget *parent)
    : QWidget(parent) // 调用基类 QWidget 的构造函数
    , ui(new Ui::Widget) // 初始化 UI 对象
{
    ui->setupUi(this); // 设置 UI 组件

    // 设置定时器精度为精确定时器
    timer.setTimerType(Qt::PreciseTimer);
    /*
     * Qt::PreciseTimer:精确定时器,精度尽量保持在毫秒级。
     * Qt::CoarseTimer:粗糙定时器,定时误差尽量在定时周期值的5%以内。
     * Qt::VeryCoarseTimer:非常粗糙的定时器,精度保持在秒级。
     */
    timer.start(100); // 启动定时器,每100毫秒触发一次

    // 连接定时器的 timeout 信号到 timeoutSlotFun 槽函数
    connect(&timer, SIGNAL(timeout()), this, SLOT(timeoutSlotFun()));
}

// Widget 类的析构函数
Widget::~Widget()
{
    delete ui; // 删除 UI 对象,释放内存
    // QTimer 的内存由 QWidget 管理,不需要手动删除
}

// 定时器超时处理函数
void Widget::timeoutSlotFun()
{
    static int a = 10; // 静态变量 a 用于记录计数值
    a++; // 计数器递增

    ui->label->setText("hello"); // 设置 QLabel 的文本为 "hello"
    ui->label->setText(QString("this is number: %1").arg(a)); // 更新 QLabel 的文本,显示当前计数值

    // 当计数器 a 达到500时,停止定时器
    if (a == 500) {
        timer.stop(); // 停止定时器
    }
}

日期时间数据

  • QTime:表示时间数据的类,时间数据如12:04:35。
  • QDate:表示日期数据的类,日期数据如2021-9-15。
  • QDateTime:表示日期时间数据的类,日期时间数据如2021-09-16 17:22:43。
QTime类
  1. QTime 是用于存储和操作时间数据的类,时间数据包含小时、分钟、秒、毫秒。QTime总是
    使用24小时制,不区分AM/PM。
  2. QTime::currentTime()可以获取系统的当前时间
  3. QTime TM1(1,1,1);//初始化设置时间为1时1分1秒
  4. QString str = TM1.toString("HH:mm:ss"); // 将时间格式化为字符串
  5. 可以通过对时间变量.hour这种方法获得单独小时这种。
QDate类
  1. QDate 是用于存储和操作日期数据的类。日期数据包含年、月、日数据。
  2. QDate::currentDate()获取系统的当前日期创建一个QDate 变量。
  3. QString str= DT2.toString("yyyy-MM-dd"); // 将时间格式化为字符串
QDateTime类
  1. QDateTime 是表示日期时间数据的类,包含日期数据和时间数据。QDateTime 综合了日期和
    时间的操作,很多函数与QDate和QTime的相似。
  2. QDateTime QDateTime::currentDateTime() //返回系统的当前日期时间,本地时间
    QDateTime QDateTime::currentDateTimeUtc() //返回系统的当前日期时间,UTC时间
代码展示
cpp 复制代码
void Widget::on_btnDebugDateTime_clicked()
{
    // 获取当前的日期和时间
    QDateTime DT1 = QDateTime::currentDateTime();

    // 将日期和时间格式化为 "年-月-日 时:分:秒"
    QString str = DT1.toString("yyyy-MM-dd hh:mm:ss");
    qDebug("DT1= %s", str.toLocal8Bit().data()); // 输出当前的日期和时间

    // 获取日期部分
    QDate dt = DT1.date();
    str = dt.toString("yyyy-MM-dd"); // 将日期格式化为 "年-月-日"
    qDebug("DT1.date()= %s", str.toLocal8Bit().data()); // 输出日期部分

    // 获取时间部分
    QTime tm = DT1.time();
    str = tm.toString("hh:mm:ss zzz"); // 将时间格式化为 "时:分:秒 时区"
    qDebug("DT1.time()= %s", str.toLocal8Bit().data()); // 输出时间部分

    // 获取从 1970-01-01 到当前时间的秒数
    qint64 MS = DT1.toSecsSinceEpoch();
    qDebug("DT1.toSecsSinceEpoch()= %lld", MS); // 输出秒数

    MS += 120; // 增加 120 秒
    DT1.setSecsSinceEpoch(MS); // 设置新的时间
    str = DT1.toString("yyyy-MM-dd hh:mm:ss"); // 将更新后的时间格式化为 "年-月-日 时:分:秒"
    qDebug("DT1+120s= %s", str.toLocal8Bit().data()); // 输出更新后的时间
}

void Widget::on_btnDebugDate_clicked()
{
    // 初始化日期为 2021年7月6日
    QDate DT1(2021, 7, 6);
    QString str = DT1.toString("yyyy-MM-dd"); // 将日期格式化为 "年-月-日"
    qDebug("DT1= %s", str.toLocal8Bit().data()); // 输出初始化的日期

    // 设置日期为 2021年8月25日
    QDate DT2;
    DT2.setDate(2021, 8, 25);
    str = DT2.toString("yyyy-MM-dd"); // 将新日期格式化为 "年-月-日"
    qDebug("DT2= %s", str.toLocal8Bit().data()); // 输出设置后的日期

    // 计算 DT2 和 DT1 之间的天数差
    qDebug("Days between DT2 and DT1= %d", DT2.daysTo(DT1)); // 输出两日期之间的天数

    // 获取当前日期
    DT2 = QDate::currentDate();
    str = DT2.toString("yyyy-MM-dd"); // 将当前日期格式化为 "年-月-日"
    qDebug("Current date= %s", str.toLocal8Bit().data()); // 输出当前日期

    // 输出当前日期的各个组成部分
    qDebug("Year= %d", DT2.year()); // 输出年份
    qDebug("Month= %d", DT2.month()); // 输出月份
    qDebug("Day= %d", DT2.day()); // 输出日期
    qDebug("Day of week= %d", DT2.dayOfWeek()); // 输出星期几(1 表示星期一,7 表示星期天)
}

void Widget::on_btnDebugTime_clicked()
{
    // 定义并初始化时间为 13:24:05
    QTime TM1(13, 24, 5);
    QString str = TM1.toString("HH:mm:ss"); // 将时间格式化为 "时:分:秒"
    qDebug("Original time= %s", str.toLocal8Bit().data()); // 输出原始时间

    // 延后 150 秒
    QTime TM2 = TM1.addSecs(150);
    str = TM2.toString("HH:mm:ss"); // 将延后后的时间格式化为 "时:分:秒"
    qDebug("150s later, time= %s", str.toLocal8Bit().data()); // 输出延后后的时间

    // 获取当前时间
    TM2 = QTime::currentTime();
    str = TM2.toString("HH:mm:ss zzz"); // 将当前时间格式化为 "时:分:秒 时区"
    qDebug("Current time= %s", str.toLocal8Bit().data()); // 输出当前时间

    // 输出当前时间的各个组成部分
    qDebug("Hour= %d", TM2.hour()); // 输出小时
    qDebug("Minute= %d", TM2.minute()); // 输出分钟
    qDebug("Second= %d", TM2.second()); // 输出秒
    qDebug("MSecond= %d", TM2.msec()); // 输出毫秒
}
相关推荐
动感小麦兜2 分钟前
NAS学习
java·开发语言·eureka
小安同学iter19 分钟前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务
c骑着乌龟追兔子25 分钟前
Day 32 函数专题1:函数定义与参数
开发语言·前端·javascript
yaoxin52112327 分钟前
262. Java 集合 - Java 中 ArrayList 与 LinkedList 读取元素性能大对决
java·开发语言
椰萝Yerosius29 分钟前
MATLAB简介
开发语言·数学建模·matlab
李日灐38 分钟前
C++STL:list(双链表)的底层实现 && 部分源码解析
开发语言·c++
无限进步_1 小时前
C语言宏的魔法:探索offsetof与位交换的奇妙世界
c语言·开发语言·windows·后端·算法·visual studio
代码雕刻家1 小时前
C语言关于换行符的注意事项
c语言·开发语言
认真敲代码的小火龙1 小时前
【JAVA项目】基于JAVA的图书管理系统
java·开发语言·课程设计
爱敲代码的小冰1 小时前
js 时间的转换
开发语言·前端·javascript