Qt常用类(5)QFileInfo、QFile、QDataTime

在这里插入图片描述

1.QFileInfo

Qt提供了QFileInfo类以获取文件系统中文件的相关属性,包括了文件的大小,权限,所有权,创建时间,修改时间,是否绝对路径,是否可写等等,在做应用时访问本地文件时往往会用到,这里挑了几个方法,做个使用示范,代码与编译结果粘贴如下。
.h文件

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QFileDialog>
#include <QFileInfo>
#include <QMessageBox>
#include <QDateTime>
#include <QDir>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_openFileBtn_clicked();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_openFileBtn_clicked()
{
    //打开一个文件,将文件属性打印在界面上
    QString fileName = QFileDialog::getOpenFileName(this,"打开文件",QDir::homePath());//定位到home目录
    if(fileName.isEmpty()){
        QMessageBox::information(this,"提示","请选择一个文件");
        return;
    }
    else{
        QFileInfo info(fileName);
        ui->sizeLine->setText(QString::number(info.size()));//获取文件大小
        QDateTime creatTime = info.created();//获取文件创建时间
        ui->creatTimeLine->setText(creatTime.toString("yyyy-MM-dd hh:mm:ss"));
        QDateTime lastTime = info.lastRead();//获取文件上一次访问时间
        ui->lastReadLine->setText(lastTime.toString("yyyy-MM-dd hh:mm:ss"));
        if(info.isDir()){//是否为目录
            ui->isDirLine->setText("是");
        }
        else{
            ui->isDirLine->setText("不是");
        }
    }
}

调试结果
在这里插入图片描述

2.QFile

Qt的文件操作非常简单,Qt中提供QIODevice类作为所有I/O设备基础接口,为IO设备如QFile提供了一个抽象接口。QFile是一个可读可写文本文件、二进制文件、以及qt资源文件的IO设备。访问一个设备以前,需要使用open()函数打开该设备,而且必须制定正确的打开模式。使用write()、putchar方法写入,read(),readline()、readAll()方法读出,也可以与QTextStream或QDataStream结合使用,更为方便。那么在操作结束之后,应该使用close()方法关闭文件,保持良好习惯。

创建一个案例,输出txt文档,分别使用write和QTextStream两种方法写入。

  • 1.在.cpp或.h中添加头文件
#include <QFile>
#include <QTextStream>
  • 2.cpp文件中代码如下,首先构造文件对象,按照参数名称创建文件,然后以append方式打开文件,使用QTextStream类提供的方法写入“文字”,使用write()函数写入字符串,最后调用close()关闭文件。
 	QFile file("Day12.txt");
    file.open(QIODevice::Append);
    //使用QTextStream写入文件
    QTextStream tsm(&file);
    QString str = "请相信,所有的积累都有其特定的价值!\r\n";
    tsm<<str<<"Designed by Jack chen";
    file.write("Day12\r\n");
    file.close();

3.运行效果:构建目录下生成Day12.txt文件,内容如下:
在这里插入图片描述

3.QT获取系统时间戳

Qt项目中,常常需要获取当前系统时间,以用来精确计算某些处理程序的时延,或者在日志,状态检测中也常常需要打印系统时间,更好的满足人机交互的需求。

3.1QDatatime使用步骤

  • 1.在.cpp中或者.h中添加头文件
#include <QDateTime>
  • 2.利用方法创建对象,获取系统时间信息
QDateTime c_time = QDateTime::currentDateTime();
  • 3.转换为字符串格式
QString t_str = c_time.toString( "yyyy年MM月dd日 hh:mm:ss");
  • 4.代码与效果
    该代码,单击“显示当前时间”按钮,将会在Textedit中显示日志应用和延时计算应用两种格式的代码,代码如下:
    connect(ui->disBtn,&QPushButton::clicked,[=](){
        QDateTime c_time = QDateTime::currentDateTime();
        QString t_str = c_time.toString( "yyyy年MM月dd日 hh:mm:ss"); 
        t_str=t_str.append("   ");
        t_str=t_str.append("日志应用打印系统时间");
        ui->disEdit->append(t_str); //设置显示当前系统时间
        
        QString str =c_time.toString("yyyy.MM.dd hh:mm:ss.zzz ddd");
        str=str.append("   ");
        str=str.append("延时计算打印系统时间");
        ui->disEdit->append(str);
    });

在这里插入图片描述

3.2 使用windows API精确记录时间

步骤:

  • 1.添加头文件#include <windows.h>
  • 2.使用了Windows API函数QueryPerformanceFrequency来获取计时器的频率
  • 3.在计时开始时,用QueryPerformanceCounter来获取当前计数值。
  • 4.在计时结束时,再次用QueryPerformanceCounter来获取当前计数值。该函数返回的是LARGE_INTEGER,它是Windows API中定义的一个结构体,用于表示一个64位的有符号整数。获取到的计数值保存在LARGE_INTEGER结构体的成员变量QuadPart,它是一个64位的有符号整数。
  • 5.通过计数值相减除以频率值获得被测代码总耗时,可以精确到微秒。
  • 6.在QT程序中使用该方法有时会出错,这时在.pro中添加DEFINES +="_HAS_STD_BYTE=0"即可。

代码示例如下:


#include "widget.h"
#include "ui_widget.h"
#include <windows.h>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    LARGE_INTEGER   start;
    LARGE_INTEGER  stop;
    LARGE_INTEGER   freq;
    QueryPerformanceFrequency(&freq);
    QueryPerformanceCounter(&start);
    for(int i =0;i<1000000;i++){
    }
    QueryPerformanceCounter(&stop);
    double  time_sec = (unsigned long long)(stop.QuadPart - start.QuadPart) / (double)freq.QuadPart;//单位是S,精确到us
    qDebug()<<"for need time :"<<time_sec;
}
Widget::~Widget()
{
    delete ui;
}

计时结果如下:

​​在这里插入图片描述

4.传送门

END

🎏文章原创,首发于CSDN论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要生成具有时间有效期和扫描次数限制的二维码,您需要使用一个第三方库来生成这样的二维码。其中一个这样的库是 QREncode,在 Qt 应用程序中可以使用它来生成带有时间有效期和扫描次数限制的二维码。 以下是一个简单的示例代码,演示如何使用 QREncode 库来生成带有时间有效期和扫描次数限制的二维码: ```cpp #include "qrencode.h" void createQRCodeWithLimitations(const QString &text, int scanLimit, int timeLimit) { // 创建 QRCode 对象 QRcode *qrcode = QRcode_encodeString(text.toUtf8().data(), 0, QR_ECLEVEL_L, QR_MODE_8, 1); // 计算二维码的大小 int qrSize = qrcode->width > 0 ? qrcode->width : 1; // 计算每个像素的大小 int pixelSize = 5; // 创建 QImage 对象 QImage image(qrSize * pixelSize, qrSize * pixelSize, QImage::Format_Mono); // 设置白色背景 image.fill(Qt::white); // 绘制黑色像素 for (int y = 0; y < qrSize; y++) { for (int x = 0; x < qrSize; x++) { unsigned char *p = qrcode->data + y * qrcode->width + x; if (*p & 1) { for (int i = 0; i < pixelSize; i++) { for (int j = 0; j < pixelSize; j++) { image.setPixel(x * pixelSize + i, y * pixelSize + j, qRgb(0, 0, 0)); } } } } } // 添加时间有效期和扫描次数限制的元数据 QByteArray metaData; metaData.append(QString("T%1").arg(timeLimit).toUtf8()); metaData.append(QString("C%1").arg(scanLimit).toUtf8()); QByteArray qrData; qrData.append(metaData); qrData.append(QByteArray((char *)qrcode->data, qrcode->width * qrcode->width)); // 释放 QRCode 对象 QRcode_free(qrcode); // 将二维码保存为文件或在程序中显示 // ... } ``` 调用该函数,可以生成一个带有时间有效期和扫描次数限制的二维码: ```cpp createQRCodeWithLimitations("Hello, world!", 10, 3600); // 扫描次数限制为 10 次,时间有效期为 1 小时 ``` 请注意,生成带有时间有效期和扫描次数限制的二维码需要在扫描和处理二维码的应用程序中正确处理元数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA小油条

原创不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值