多页面
-
widget.ui 负责实现一个页面; mian.cpp创建窗体对象,并监控上面的事件
-
窗口的显示和隐藏:
一个窗体,比如logpage widget,继承QWidget
QWidget::show(); 显示该窗体
QWidget::hide(); 隐藏该窗体 -
页面间通信采用在main.cpp中创建connect槽函数。
-
代码如下
//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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_OBJECTpublic: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
- QTimer 是软件定时器,其父类是QObject。QTimer 的主要功能是设置以毫秒为单位的定时周期,然后进行连续定时或单次定时。启动定时器后,定时溢出时QTimer会发射timeout()
信号,为timeout()信号关联槽函数就可以进行定时处理。 - 常用方法
函数 | 含义 |
---|---|
start(int msec) | 启动定时器,定时器会在每个 msec 毫秒后发出一次 timeout 信号。 |
stop() | 停止定时器。 |
setInterval(int msec) | 设置定时器的时间间隔为 msec 毫秒。 |
isActive() | 检查定时器是否正在运行。 |
- 代码举例
//widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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类
- QTime 是用于存储和操作时间数据的类,时间数据包含小时、分钟、秒、毫秒。QTime总是
使用24小时制,不区分AM/PM。 - QTime::currentTime()可以获取系统的当前时间
QTime TM1(1,1,1);
//初始化设置时间为1时1分1秒- QString str = TM1.toString(“HH:mm:ss”); // 将时间格式化为字符串
- 可以通过对时间变量.hour这种方法获得单独小时这种。
QDate类
- QDate 是用于存储和操作日期数据的类。日期数据包含年、月、日数据。
- QDate::currentDate()获取系统的当前日期创建一个QDate 变量。
- QString str= DT2.toString(“yyyy-MM-dd”); // 将时间格式化为字符串
QDateTime类
- QDateTime 是表示日期时间数据的类,包含日期数据和时间数据。QDateTime 综合了日期和
时间的操作,很多函数与QDate和QTime的相似。 - QDateTime QDateTime::currentDateTime() //返回系统的当前日期时间,本地时间
QDateTime QDateTime::currentDateTimeUtc() //返回系统的当前日期时间,UTC时间
代码展示
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:05QTime 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()); // 输出毫秒
}