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()); // 输出毫秒
}
相关推荐
汤姆和杰瑞在瑞士吃糯米粑粑3 分钟前
模板(C++)
开发语言·c++
这题怎么做?!?5 分钟前
【Linux】多线程:线程同步、条件变量
linux·c语言·开发语言
武昌库里写JAVA17 分钟前
玩转springboot之springboot热部署
java·c语言·开发语言·数据结构·算法
大筒木老辈子18 分钟前
C++笔记---list
开发语言·c++·笔记
blammmp19 分钟前
Java:抽象类和接口(1)
java·开发语言
小何开发30 分钟前
自制一键杀死端口进程程序# tomcat 如何杀死tomcat进程
开发语言·python
莫毅忆1 小时前
深入理解中比较两个字符串差异的方法”或“高效比对字符串:diff-match-patch:c++实战指南
开发语言·c++·qt
阑梦清川1 小时前
C#环境搭建和入门教程--vs2022之下
开发语言·c#
爆炒的番茄1 小时前
初识C++(二)
开发语言·c++·算法
黄卷青灯771 小时前
c++ vector类 和 eigen库 处理向量的区别 列出代码举例
开发语言·c++·vector·eigen