多页面
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_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
- 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_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类
- 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: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()); // 输出毫秒
}