QT基础学习笔记 Demo05

1. 目录操作

主要用到两个类:QDir(文件)、QFileInfo(文件信息)

1.1 QDir

QDir 类具有存取目录结构和内容的能力,使用它可以操作目录、存取目录或文件信息、操作底层文件系统,而且还可以存取 Qt 的资源文件。
判断目录是否存在可以使用 exists(),目录的属性可以使用 isReadable()、isAbsolute ()、 isRelative()和 isRoot()来获取 。 目录下有很多条目,包括文件、目录和符号连接,总的条目数可以使用 count()来统计。 entryList()返回目录下所有条目组成的字符串链表 。 文件可以使用 remove()函数删除,删除目录用 rmdir() ,改名用rename()。
一般使用Filters对目录下的文件进行过滤。

1.2 QFileInfo

QFilelnfo 类提供了与系统无关的文件信息,包括文件的名称、在文件系统中的位置(路径)、文件的访问权限以及是否是一个目录或者符号链接等 。 QFilelnfo也可以获取文件的大小和最近一次修改/读取的时间,还可以获取 Qt 资源的相关信息 。
QFilelnfo 指向的文件可以在 QFileinfo 对象构建时设置,或者以后使用 setFile()来设置。可以使用以exists()来查看文件是否存在,使用 size ()获取文件的大小。

1.3 判断文件是否存在

文件存在返回为true,不存在则为false

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir dir("E:/2103/QtDemo");//打开文件
    qDebug()<<dir.exists();//判断是否存在

	//键盘输入获取内容
	QTextStream qin(stdin);
    QString str;
    qin>>str;
    QDir dir(str);
    qDebug()<<dir.dirName();
    return a.exec();
}

在这里插入图片描述

1.4 创建目录

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

//    QDir dir("E:/2103/QtDemo");//打开文件
//    qDebug()<<dir.exists();//判断是否存在


    QDir dir("E:/2103");
    if(!dir.exists())
    {
        dir.mkdir("E:/2103");
        qDebug()<<"创建成功";
    }
    else
        qDebug()<<"文件存在";
    return a.exec();
}

1.5 获取常用目录

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir dir;
    qDebug()<<dir.current();//
    qDebug()<<dir.currentPath();//当前目录
    qDebug()<<dir.homePath();//用户文件夹
    qDebug()<<dir.tempPath();//临时文件夹 temp
    qDebug()<<dir.rootPath();//根目录
    return a.exec();
}

1.6 切换路径

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir dir("E:/2103");
    dir.setPath("E:/");//设置路径 
    qDebug()<<dir.dirName();//当前文件夹名字
    qDebug()<<dir.absolutePath();//当前文件夹绝对路径
    dir.cd("C:/");//改盘
    qDebug()<<dir.absolutePath();
    return a.exec();
}

1.7 遍历文件

#include <QCoreApplication>
#include <QDir>
#include <QFileInfo>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QDir dir("E:/2103/QtDemo");
    foreach (QFileInfo item, dir.entryInfoList()) {
        if(item.isDir())
            qDebug()<<"文件夹:"<<item.filePath();//路径
        else if(item.isFile())
            qDebug()<<"文件"<<item.filePath();//路径
    }
    return a.exec();
}

1.8 示例——利用treeWidget遍历文件

效果图
在这里插入图片描述

这里可能会有小伙伴不明白,部分知识详见QT界面设计TreeWidget设计
.h文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>
#include <QTreeWidget>
#include <QDebug>
#include <QDir>
#include <QFileInfo>
#include <QStyleFactory>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    QTreeWidget *treeWidget;
    QHBoxLayout *hLyaout;
private:
    void getName(const QString &dir,QTreeWidgetItem *item);
};

#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"



Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    hLyaout=new QHBoxLayout(this);// 水平布局再窗口上
    treeWidget=new QTreeWidget(this);//treeWidget放在窗口上
    hLyaout->addWidget(treeWidget);//控件放入布局

    treeWidget->header()->setVisible(false); //隐藏头(将列隐藏)
    treeWidget->headerItem()->setText(0,"123"); //添加头 or根节点
    treeWidget->setStyle(QStyleFactory::create("windows"));//设置Windows风格
    QString filepath("E:/QT");//这里不是文件目录 因为下面setText第二个参数是QString类型
    QTreeWidgetItem*item=new QTreeWidgetItem(treeWidget);//设置子节点
    item->setText(0,filepath);//设置字符串名字
    //treeWidget->addTopLevelItem(item);
    getName(filepath,item);//构建ui后进入函数
}

Widget::~Widget()
{
    delete ui;
}

void Widget::getName(const QString &dir, QTreeWidgetItem *item)//取地址    指针
{
    qDebug()<<dir;//方便查看是否遍历所有文件  输出

    QDir d(dir);
    if(!d.exists())
        return;
    foreach (QFileInfo info, d.entryInfoList()) {   //遍历文件
        if(info.isDir())//文件夹
        {
            if(info.fileName()=="."||info.fileName()=="..")//将文件中的.和..过滤
                continue;
            QTreeWidgetItem *child=new QTreeWidgetItem(item);//设置子节点接受
            child->setText(0,info.fileName());//子节点设置字符串
            item->addChild(child);//根节点后面添加子节点   
            getName(info.filePath(),child);//递归
        }
        else//不是文件夹   这里道理同上
        {
            QTreeWidgetItem *child=new QTreeWidgetItem(item);
            child->setText(0,info.fileName());
            item->addChild(child);
        }
    }
}


优化获取图标👇

#include "widget.h"
#include "ui_widget.h"



Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    hLyaout=new QHBoxLayout(this);// 水平布局再窗口上
    treeWidget=new QTreeWidget(this);//treeWidget放在窗口上
    hLyaout->addWidget(treeWidget);//控件放入布局

    treeWidget->header()->setVisible(false); //隐藏头(将列隐藏)
    treeWidget->headerItem()->setText(0,"123"); //添加头 or根节点
    treeWidget->setStyle(QStyleFactory::create("windows"));//设置Windows风格
    QString filepath("E:/QT");//这里不是文件目录 因为下面setText第二个参数是QString类型
    QTreeWidgetItem*item=new QTreeWidgetItem(treeWidget);//设置子节点
    item->setText(0,filepath);//设置字符串名字
    treeWidget->addTopLevelItem(item);
    getName(filepath,item);//构建ui后进入函数
}

Widget::~Widget()
{
    delete ui;
}

void Widget::getName(const QString &dir, QTreeWidgetItem *item)//取地址    指针
{
    qDebug()<<dir;//方便查看是否遍历所有文件  输出



    QDir d(dir);
    if(!d.exists())
        return;
    foreach (QFileInfo info, d.entryInfoList()) {   //遍历文件
        if(info.isDir())//文件夹
        {
            if(info.fileName()=="."||info.fileName()=="..")//将文件中的.和..过滤
                continue;
            QTreeWidgetItem *child=new QTreeWidgetItem(item);//设置子节点接收

            QFileInfo f(info.filePath());//获取文件图标
            QFileIconProvider icon;//设置icon
            QIcon i=icon.icon(f);//icon 保存获取的图标
            QPixmap pixmap=i.pixmap(10,10);// pixmap设置大小
            item->setIcon(0,pixmap);//QTreeWidgetItem 设置图标

            child->setText(0,info.fileName());//子节点设置字符串
            item->addChild(child);//根节点后面添加子节点


            getName(info.filePath(),child);//递归
        }
        else//不是文件夹   这里道理同上
        {
            QTreeWidgetItem *child=new QTreeWidgetItem(item);

            QFileInfo f(info.filePath());
            QFileIconProvider icon;
            QIcon i=icon.icon(f);
            QPixmap pixmap=i.pixmap(10,10);
            item->setIcon(0,pixmap);

            child->setText(0,info.fileName());
            item->addChild(child);
        }
    }
}

在这里插入图片描述

2. 文件操作

2.1 QFile

QFile 类提供了 一个用于读/写文件的接口,它可以用来读/写文本文件、二进制文件和 Qt 资源的I/0 设备。
一般在构建 QFile 对象时便指定文件名,当然也可以使用 setFileName ()进行设置。可以使用 exists()来检查文件是否存在使用 remove()来删除一个文件 。
一个文件可以使用 open() 打开,使用 close()关闭,使用 flush()刷新 ,文件的读写可以使用 read ()、readLine ()、 readAll ()和 write (),可以使用自size()函数来获取文件的大小,使用 seek ()来定位到文件的任意位置,使用 pos ()来获取当前的位置,使用 atEnd ()来判断是否到达了文件的末尾
还是可以用以下学过FILE,fstream这些来进行文件操作

2.2 打开并写入文件

文件操作流程 打开>写入/读取>关闭
访问一个设备以前,需要使用 open ()函数打开该设备,而且必须指定正确的打开模式,不同的打开模式之间可以使用“|”符号同时使用。
打开设备后可以使用 write()或者 putChar()来进行写人,可以使用seek函数进行文件指针移动(如果有),使用read ()、 readLine ()或者 readAll ()进行读取,最后使用 close()关闭设备。

枚举值描述
QIODevice::NotOpen未打开
QIODevice::ReadOnly以只读方式打开
QIODevice::WriteOnly以只写方式打开
QIODevice::ReadWrite以读写方式打开
QIODevice::Truncate以重写的方式打开,再写入新的数据时会将游标设置在文件开头;覆盖重写
QIODevice::Append以追加的方式打开,新增的内容被追加到文件末尾
QIODevice::Text读取时,将行结束符转换成\n;在写入时,将行结束符转换成本地格式,在Win32平台上是\r\n
QIODevice::Unbuffered忽略缓存
    QFile file("a.txt");//相对路径
    if(!file.open(QIODevice::ReadOnly|QIODevice::Text))//文件不存在将会创建文件
    {
        qDebug()<<file.errorString();//报错
    }
//    else
//    {
//        qDebug()<<"打开成功";
//    }
//    file.write("\njkjkj");//写入时会覆盖掉原来数据
//    file.write("trytope");

    while(!file.atEnd())//读取全部数据
    {
        QByteArray arr=file.readAll();
        qDebug()<<QString::fromLocal8Bit(arr);//这里转换成字符串 读出时的结果还是有些不正确的中文字,需要将文件编码从utf8转换成ANSI类型
    }
    file.close();
    file.rename("哈哈哈.txt");//修改文件添加后缀
    file.remove();//删除

2.3 QIODevice类

QIODevice 类是 Qt 所有 I/O 设备的基础类 ,为QFIle等类提供一个抽象接口

继承图,这些都是他的子类在这里插入图片描述

3. 标准对话框

这里是QT中的示例——Standard Dialo

3.1 标准输入对话框

在这里插入图片描述

#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_pushButton_clicked()
{
    bool ok;
    int i=QInputDialog::getInt(this,"提示","文本",15//默认值
                               ,0//最小值
                               ,100//最大值
                               ,1//步长
                               ,&ok//是否点击ok
                               );
    if(ok)
        qDebug()<<i;
}

3.2 标准字体对话框

在这里插入图片描述

void Widget::on_pushButton_clicked()
{

    bool ok;
    QFont font=QFontDialog::getFont(&ok,QFont("黑体"),this,"选择字体");
    if(ok)
    {
        qDebug()<<font.key();
    }

}

3.3 标准颜色对话框

在这里插入图片描述

#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_pushButton_clicked()
{

       QColor color=QColorDialog::getColor(Qt::red,this,"文本");
       qDebug()<<color.red()<<" "<<color.green()<<" "<<color.blue();
}

3.4 标准文件对话框

#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_pushButton_clicked()
{

    QString fileName=QFileDialog::getOpenFileName(this,"文本","E:/","All Files(*);;Text File(*.txt)");
    if(!fileName.isEmpty())
        qDebug()<<fileName;
}

3.5 标准消息对话框

这里就是c++中的MessageBox

QMessageBox::information(this," 标题",“文本”);
QMessageBox::warning(this,“标题”,“文本”);
QMessageBox::critical(this,“标题”,“文本”);
QMessageBox::question(this,“标题”,“文本”);
返回值是选中的按钮,对于第4,5,6个参事指明的按钮,当然有默认的,可以不填,注意第一个父类的,这
里的父类得要是一个窗口对象,而且不能在窗口处理完前死亡,按钮可以是以下按钮
QMessageBox::NoButton
QMessageBox::Ok
QMessageBox::Cancel
QMessageBox::Yes
QMessageBox::No
QMessageBox::Abort
QMessageBox::Retry
QMessageBox::Ignore
QMessageBox::YesAll
QMessageBox::NoAll

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Javaer.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值