QT 学习笔记(十二)

简介: QT 学习笔记(十二)

文章目录




由于每次代码都是在原有程序上修改,因此除了新建项目,不然一般会在学完后统一展示代码。

提示:具体项目创建流程和注意事项见QT 学习笔记(一)

提示:具体项目准备工作和细节讲解见QT 学习笔记(二)


一、文件系统

1. 文件系统简介


  • 文件操作是应用程序必不可少的部分。
  • QT 作为一个通用开发库,提供了跨平台的文件操作能力。QT 通过 QIODevice 提供了对 I/O 设备的抽象,这些设备具有读写字节块的能力。
  • 下面是 I/O 设备的类图(QT5):

f7d5a5c82976418d95b0ec567d426c42.png


QIODevice:所有 I/O 设备类的父类,提供了字节块读写的通用操作以及基本接口。

QFileDevice:Qt5新增加的类,提供了有关文件操作的通用实现。

QFlie:访问本地文件或者嵌入资源。

QTemporaryFile:创建和访问本地文件系统的临时文件。

QBuffer:读写QbyteArray, 内存文件。

QProcess:运行外部程序,处理进程间通讯。

QAbstractSocket:所有套接字类的父类。

QTcpSocket:TCP协议网络数据传输。

QUdpSocket:传输 UDP 报文。

QSslSocket:使用 SSL/TLS 传输数据



2. 文件系统分类


(1) 顺序访问设备是指它们的数据只能访问一遍:从头走到尾,从第一个字节开始访问,直到最后一个字节,中途不能返回去读取上一个字节,这其中,QProcess、QTcpSocket、QUdpSoctet 和 QSslSocket 是顺序访问设备。

(2) 随机访问设备可以访问任意位置任意次数,还可以使用 QIODevice::seek() 函数来重新定位文件访问位置指针,QFile、QTemporaryFile 和 QBuffer 是随机访问设备。


二、基本文件操作

  • 生成一个新的项目,具体步骤过程见提示。


文件操作是应用程序必不可少的部分。QT 作为一个通用开发库,提供了跨平台的文件操作能力。在所有的 I/O 设备中,文件 I/O 是最重要的部分之一。因为我们大多数的程序依旧需要首先访问本地文件(当然,在云计算大行其道的将来,这一观点可能改变)。QFile提供了从文件中读取和写入数据的能力。

我们通常会将文件路径作为参数传给QFile的构造函数。不过也可以在创建好对象最后,使用 setFileName() 来修改。QFile 需要使用 / 作为文件分隔符,不过,它会自动将其转换成操作系统所需要的形式。例如 C:/windows 这样的路径在 Windows 平台下同样是可以的。

QFile 主要提供了有关文件的各种操作,比如打开文件、关闭文件、刷新文件等。我们可以使用 QDataStream 或 QTextStream 类来读写文件,也可以使用 QIODevice 类提供的 read()、readLine()、readAll() 以及 write() 这样的函数。值得注意的是,有关文件本身的信息,比如文件名、文件所在目录的名字等,则是通过 QFileInfo 获取,而不是自己分析文件路径字符串。

————————————————


1. QFile 读文件

  • 首先,需要先在 ui 界面设计出我们预想当中的界面布局。


0978e76d092a4aea84dd3879b667bbf1.png



通过对 readfile 按钮通过转到槽操作,进行槽函数的代码编写。

在读文件操作当中,先定义 path 通道,在该函数中,第一个参数是指定父对象,第二个参数是标题,第三个参数是路径,第四个参数如果不写的话表示可以打开所有为该标题的文件,如果写就是对打开文件的格式进行限制,在此处举例为 txt 文件。

QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");
  • 在读文件的过程中,我们需要注意的是默认只识别 utf8 编码的文件,如果非此类文件将会乱码。
  • 如果我们想读取其他类型的文件,需要借助文件流进行操作。
  • 下面展示直接读取全部的实现现象,如下图所示:

edc83359c8784f8d9e6cb00966cae544.png


除了直接读取全部文件外,我们也可以一行一行地读取文件,具体现象如下图所示:


46a07cb4fcb84296816e1591ec53b15f.png


  • QFile 读文件代码如下(需要包含 QFile 和 QFileDialog 两个头文件):
void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        //文件对象,默认只识别utf8编码
        QFile file(path);
        //打开文件,只读方式
        bool isok=file.open(QIODevice::ReadOnly);
        if(isok==true)
        {
#if 0
            //直接读全部文件
            QByteArray array=file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd()==false)
            {
                //读一行
                array+=file.readLine();
            }
            ui->textEdit->setText(array);
        }
        //关闭文件
        file.close();
    }
}


2. QFile 写文件


在 QFile 读文件的基础上进行操作。

通过对 writefile 按钮通过转到槽操作,进行槽函数的代码编写。

在写文件操作当中,先定义 path 通道,在该函数中,第一个参数是指定父对象,第二个参数是标题,第三个参数是路径,第四个参数如果不写的话表示打开所有为该标题的文件,如果写就是对打开文件的格式进行限制,在此处举例为 txt 文件。

QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");


在运行后,我们在文本编辑区编写文本内容,并点击 wirtefile 按钮。


68f3b6aa18aa4966a7f5a0a9aedb7224.png


  • 随后,会在对应的文件目录下生成我们所保存的文件,打开之后就是我们所写的文件。
  • 在 QFile 写文件当中,主要识别的编码方式仍是 Utf8 ,但是,可以通过转换得到我们显示出我们所需要的编码方式。

b4e14ad81f6f47a99c2c863f5fc4426b.png


  • QFile 写文件代码如下:
void Widget::on_buttonread_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        QFile file;//创建文件对象
        //关联文件名字
        file.setFileName(path);
        //打开文件,只写文件
        bool isok=file.open(QIODevice::WriteOnly);
        if(isok==true)
        {
            QString str=ui->textEdit->toPlainText();
            //写文件
            //在这里需要将 QString 转换为 QByteArray
            file.write(str.toUtf8());
            //QString -> c++ string -> char*
            //file.write(str.toStdWString().data());
            //转换为本地平台编码(跟window的编码方式一样)
            file.write(str.toLocal8Bit());
            //QString -> QByteArray
            QString str1="123";
            QByteArray a = str1.toUtf8();//中文(主要使用)
            a = str1.toLocal8Bit();//本地编码
            //QByteArray -> char*
            char *b=a.data();
            //char* -> QString
            char *p ="abc";
            QString c=QString(p);
        }
        file.close();
    }
}


3. QFileInfo 获取文件信息


我们可以使用 QFileInfo 获取有关该文件的信息。

QFileInfo有很多类型的函数,我们只举出一些例子。比如:

(1) isDir()检查该文件是否是目录。

(2) isExecutable() 检查该文件是否是可执行文件等。

(3) baseName() 可以直接获得文件名;

(4) completeBaseName() 获取完整的文件名

(5) suffix() 则直接获取文件后缀名。

(6) completeSuffix() 获取完整的文件后缀。

我们在读文件的时候顺便获取一下文件信息,具体现象如下图所示:

436fe3e53ee649e0a3b0b4d1aa9dc184.png


  • 具体实现代码如下()想要显示中文名称就需要将其转换为 char * 的格式):
  • toUtf8() 转换为 QByteArray 数组,data() 转换为 char *。
//获取文件信息
QFileInfo info(path);
qDebug() <<"文件名字:"<<info.fileName().toUtf8().data();
qDebug() <<"文件后缀:"<<info.suffix();
qDebug() <<"文件大小:"<<info.size();
//2023-01-01 22:03:00
qDebug() <<"文件创建时间:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");


三、基本文件操作代码

1. 主窗口头文件 widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_pushButton_2_clicked();
    void on_buttonread_clicked();
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H



2. 主窗口源文件 widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QDebug>
#include <QDateTime>
#include <QDataStream>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
}
Widget::~Widget()
{
    delete ui;
}
void Widget::on_pushButton_2_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,"open",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        //文件对象,默认只识别utf8编码
        QFile file(path);
        //打开文件,只读方式
        bool isok=file.open(QIODevice::ReadOnly);
        if(isok==true)
        {
#if 0
            //直接读全部文件
            QByteArray array=file.readAll();
            //显示到编辑区
            ui->textEdit->setText(QString(array));
#endif
            QByteArray array;
            while(file.atEnd()==false)
            {
                //读一行
                array+=file.readLine();
            }
            ui->textEdit->setText(array);
        }
        //关闭文件
        file.close();
        //获取文件信息
        QFileInfo info(path);
        qDebug() <<"文件名字:"<<info.fileName().toUtf8().data();
        qDebug() <<"文件后缀:"<<info.suffix();
        qDebug() <<"文件大小:"<<info.size();
        qDebug() <<"文件创建时间:"
                <<info.created().toString("yyyy-MM-dd hh:mm:ss");//2023-01-01 22:03:00
    }
}
void Widget::on_buttonread_clicked()
{
    QString path = QFileDialog::getSaveFileName(this,"save",".../","TXT(*.txt)");
    if(path.isEmpty()==false)
    {
        QFile file;//创建文件对象
        //关联文件名字
        file.setFileName(path);
        //打开文件,只写文件
        bool isok=file.open(QIODevice::WriteOnly);
        if(isok==true)
        {
            QString str=ui->textEdit->toPlainText();
            //写文件
            //在这里需要将 QString 转换为 QByteArray
            file.write(str.toUtf8());
            //QString -> c++ string -> char*
            //file.write(str.toStdWString().data());
            //转换为本地平台编码(跟window的编码方式一样)
            file.write(str.toLocal8Bit());
            //QString -> QByteArray
            QString str1="123";
            QByteArray a = str1.toUtf8();//中文
            a = str1.toLocal8Bit();//本地编码
            //QByteArray -> char*
            char *b=a.data();
            //char* -> QString
            char *p ="abc";
            QString c=QString(p);
        }
        file.close();
    }
}




























相关文章
|
3月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
533 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
3月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
186 4
|
3月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
634 4
|
3月前
|
数据安全/隐私保护
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
337 4
|
3月前
|
搜索推荐 C++
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框
68 4
|
3月前
|
API UED
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
【Qt 学习笔记】Qt窗口 | 状态栏 | QStatusBar的使用及说明
355 4
|
3月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
220 3
|
3月前
|
数据可视化
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
69 3
|
3月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
485 3
|
3月前
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
【Qt 学习笔记】Qt窗口 | 对话框 | Qt对话框的分类及介绍
117 3