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论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。