【四】【QT开发应用】QT设计一个图片打开器,自动记忆上次打开的路径,配置文件ini的读取与写入,QSettings变量的简单使用,当前应用程序的路径,拼接配置文件路径,设置默认路径

设计一个图片查看器

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

在这里插入图片描述

优化图片查看器

问题1:如何记住上次打开的路径?
问题2:如何指定默认的路径为 文档/图片?
问题3:如何使图片自适应显示?

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

在这里插入图片描述

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

在这里插入图片描述

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

复盘

void Widget::open2(){
    QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";
    // 获取应用程序的目录路径,并拼接出配置文件Setting.ini的完整路径
    
    qDebug() << config_path;
    // 将配置文件路径输出到调试控制台
    
    QSettings *pIniSet = new QSettings(config_path, QSettings::IniFormat);
    // 创建一个QSettings对象,用于读取和写入配置文件Setting.ini
    
    QString lastPath = pIniSet->value("/LastPath/path").toString();
    // 从配置文件中读取上次访问的路径"/LastPath/path"
    
    if (lastPath.isEmpty()) {
        lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
    }
    // 如果上次访问的路径为空,则设置默认路径为系统的“图片”目录
    
    QString fileName = QFileDialog::getOpenFileName(this, "请选择图片", lastPath, "图片(*.png *.jpg);");
    // 弹出一个文件选择对话框,默认路径为上次访问的路径,并且只允许选择PNG和JPG格式的图片
    
    if (fileName.isEmpty()) {
        return;
    }
    // 如果用户没有选择文件,则直接返回
    
    ui->lineEdit_path->setText(fileName);
    // 将选中的文件路径显示在lineEdit_path控件中
    
    ui->label_image->setPixmap(QPixmap(fileName));
    // 在label_image控件中显示选中的图片
    
    int end = fileName.lastIndexOf("/");
    // 找到选中文件路径中最后一个斜杠的位置
    
    QString _path = fileName.left(end);
    // 提取选中文件路径中的目录部分
    
    pIniSet->setValue("/LastPath/path", _path);
    // 将上次访问的路径保存到配置文件中
    
    delete pIniSet;
    pIniSet = nullptr;
    // 删除QSettings对象,释放内存
    
    qDebug() << _path;
    // 输出选中文件的目录路径到调试控制台


}

拼接配置文件路径

qApp->applicationDirPath() 是 Qt 框架中的一个函数调用,用于获取当前应用程序的目录路径。具体来说,它返回应用程序可执行文件所在的目录。
在这里插入图片描述
qApp->applicationDirPath() + "/config/Setting.ini"成功拼接出了配置文件的完整路径.

创建QSettings变量,对应配置文件

QSettings 的作用:

QSettings 是一个用于访问配置文件和应用程序设置的类。它可以读写不同格式的配置文件(如 INI 文件和注册表)。

创建 QSettings 对象时,传入配置文件路径和文件格式参数,QSettings 会根据这些参数读取相应的配置文件。
对应代码QSettings *pIniSet = new QSettings(config_path, QSettings::IniFormat);

config_path:
这是一个字符串,表示配置文件的路径。具体来说,它是通过以下代码生成的:

QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";

qApp->applicationDirPath() 获取当前应用程序的目录路径。
+"/config/Setting.ini" 在该目录路径后添加子目录和文件名,生成完整的配置文件路径。

QSettings::IniFormat:
这是一个枚举值,表示配置文件的格式。
QSettings::IniFormat 表示使用 INI 文件格式进行读取和写入操作。

在配置文件中寻找信息

QSettings 类用来读写配置文件时,按照一定的规则组织键值对。配置文件片段是这样的:

[LastPath]
path=

这是一个 INI 格式的配置文件,它由节(section)和键(key)组成。在这种格式中,方括号 [] 中的内容表示节名,而节下面的键值对表示该节的配置项。
QSettings 如何工作:

QSettings 将 INI 文件解析为节(section)和键(key)的层级结构。
节和键使用斜杠 / 分隔,这样可以方便地组织和访问配置项。

QString lastPath = pIniSet->value("/LastPath/path").toString();

pIniSet 是一个指向 QSettings 对象的指针,它被初始化为读取 Setting.ini 文件。
value(“/LastPath/path”) 方法用于从配置文件中获取指定键的值:
“/LastPath/path” 表示要查找的键。
/LastPath 表示节名 [LastPath]。
path 是 [LastPath] 节中的键名 path。

QSettings 根据 /LastPath/path 这个路径查找配置文件中的 [LastPath] 节,然后在该节中查找键 path,获取其值并返回。

如果 path 的值为空(如你提供的例子 path=),则返回一个空字符串。

这样,代码能够根据 INI 文件中的节和键结构正确地找到并读取所需的配置值。

setText和setPixmap

    ui->lineEdit_path->setText(fileName);
    // 将选中的文件路径显示在lineEdit_path控件中

    ui->label_image->setPixmap(QPixmap(fileName));
    // 在label_image控件中显示选中的图片

lineEdit控件的setText方法设置该控件的文本信息.
label控件的setPixmap方法设置控件显示图片.
传入的使直接路径,fileName是直接路径.

设置配置文件的信息

    pIniSet->setValue("/LastPath/path", _path);
    // 将上次访问的路径保存到配置文件中

_path是选择的路径的目录路径.

完整代码

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();

private:
    void open1();
    void open2();
    void open3();


private slots:
    void on_btnOpen_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QFileDialog>
#include <QSettings>
#include <QStandardPaths>
#include <memory>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    ui->label_image->clear();
}

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

void Widget::open1(){
    QString fileName= QFileDialog::getOpenFileName(this,"请选择图片","D:/","图片(*.png *.jpg);");
    if(fileName.isEmpty()){
        return;
    }

    ui->lineEdit_path->setText(fileName);
    ui->label_image->setPixmap(QPixmap(fileName));
}
void Widget::open2(){
    QString config_path = qApp->applicationDirPath() + "/config/Setting.ini";
    // 获取应用程序的目录路径,并拼接出配置文件Setting.ini的完整路径

    qDebug() << config_path;
    // 将配置文件路径输出到调试控制台

    QSettings *pIniSet = new QSettings(config_path, QSettings::IniFormat);
    // 创建一个QSettings对象,用于读取和写入配置文件Setting.ini

    QString lastPath = pIniSet->value("/LastPath/path").toString();
    // 从配置文件中读取上次访问的路径"/LastPath/path"

    if (lastPath.isEmpty()) {
        lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
    }
    // 如果上次访问的路径为空,则设置默认路径为系统的“图片”目录

    QString fileName = QFileDialog::getOpenFileName(this, "请选择图片", lastPath, "图片(*.png *.jpg);");
    // 弹出一个文件选择对话框,默认路径为上次访问的路径,并且只允许选择PNG和JPG格式的图片

    if (fileName.isEmpty()) {
        return;
    }
    // 如果用户没有选择文件,则直接返回

    ui->lineEdit_path->setText(fileName);
    // 将选中的文件路径显示在lineEdit_path控件中

    ui->label_image->setPixmap(QPixmap(fileName));
    // 在label_image控件中显示选中的图片

    int end = fileName.lastIndexOf("/");
    // 找到选中文件路径中最后一个斜杠的位置

    QString _path = fileName.left(end);
    // 提取选中文件路径中的目录部分

    pIniSet->setValue("/LastPath/path", _path);
    // 将上次访问的路径保存到配置文件中

    delete pIniSet;
    pIniSet = nullptr;
    // 删除QSettings对象,释放内存

    qDebug() << _path;
    // 输出选中文件的目录路径到调试控制台


}

void Widget::open3(){
    QString config_path=qApp->applicationDirPath()+"/config/Setting.ini";
    qDebug()<<config_path;

    QSettings *pIniSet=new QSettings(config_path,QSettings::IniFormat);
    QString lastPath=pIniSet->value("/LastPath/path").toString();

    if(lastPath.isEmpty()){
        lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
    }

    QString fileName= QFileDialog::getOpenFileName(this,"请选择图片",lastPath,"图片(*.png *.jpg);");
    if(fileName.isEmpty()){
        return;
    }

    ui->lineEdit_path->setText(fileName);

    QPixmap *pix=new QPixmap(fileName);
    pix->scaled(ui->label_image->size(),Qt::KeepAspectRatio);
    ui->label_image->setScaledContents(true);
    ui->label_image->setPixmap(*pix);

    int end=fileName.lastIndexOf("/");
    QString _path=fileName.left(end);
    pIniSet->setValue("/LastPath/path",_path);
    delete pIniSet;
    pIniSet=nullptr;
    qDebug()<<_path;
}
void Widget::on_btnOpen_clicked()
{
    // open1();
    // open2();
    open3();
}

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。
同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。
谢谢您的支持,期待与您在下一篇文章中再次相遇!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

妖精七七_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值