Qt使用QSetting记住上次打开路径的方法

 更新时间:2026年05月20日 09:31:19   作者:软件科学-郝学胜  
在图片查看工具的开发过程中,我们总会遇到一些影响使用体验的小痛点:无法记忆用户上次打开的文件路径、每次启动都固定在同一目录、图片加载后不能自适应控件大小,今天,我们就用 Qt 一步步攻克这三大难题,需要的朋友可以参考下

引言

在图片查看工具的开发过程中,我们总会遇到一些影响使用体验的小痛点:无法记忆用户上次打开的文件路径每次启动都固定在同一目录图片加载后不能自适应控件大小。这些看似细微的问题,却直接拉低了工具的实用性与流畅度。今天,我们就用 Qt 一步步攻克这三大难题,让图片查看器从 “能用” 升级为 “好用”。

一、前期准备:代码备份与方法拆分

在动手优化前,代码安全永远是第一位!我们先对原有的文件打开逻辑做完整备份,避免修改出错后无法回滚。同时,为了让逻辑更清晰,我们将打开功能拆分为多个独立方法,方便分步调试与迭代。

// 头文件中声明打开方法
private slots:
    void open1();  // 原始打开逻辑备份
    void open2();  // 记录路径+默认路径优化
    void open3();  // 智能指针优化内存
    void open4();  // 图片自适应最终版

这里需要注意:在 Qt Creator 中,头文件声明方法后,无法通过快捷键自动生成函数体,需要手动在 cpp 文件中实现,这是开发中容易忽略的小细节,提前规避能节省调试时间。

我们先将原始打开代码复制到open1()中作为备份,后续优化全部在open2()中开展,保持代码结构整洁,互不干扰。

二、核心优化 1:记住用户上次打开路径

用户每次打开图片,都希望工具能直接定位到上次使用的目录,而非重新逐层查找。Qt 本身没有自带 “记忆路径” 的功能,因此我们需要借助配置文件持久化存储路径,实现打开路径的自动记忆。

1. 配置文件规划

我们在程序编译后的debug目录下,创建config文件夹,用于存放配置文件setting.ini,所有路径数据都将保存在这个文件中。

2. 获取配置文件路径

首先通过 Qt 核心对象获取程序 exe 所在目录,拼接出配置文件的完整路径:

// 获取exe所在目录
QString appPath = QApplication::applicationDirPath();
// 配置文件完整路径:debug/config/setting.ini
QString iniPath = appPath + "/config/setting.ini";

3. 用 QSettings 读写配置文件

Qt 提供的QSettings类是读写 ini 配置文件的利器,只需引入头文件,即可轻松实现键值对的存储与读取:

#include <QSettings>

读取上次路径

启动程序时,先从配置文件读取lastPath字段:

// 初始化配置文件对象
QSettings* pIni = new QSettings(iniPath, QSettings::IniFormat);
// 读取上次保存的路径
QString lastPath = pIni->value("lastPath/path").toString();

// 若首次打开无记录,设置默认路径
if (lastPath.isEmpty()) {
    // 获取系统默认图片目录
    lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
}

这里用到QStandardPaths类,它能精准获取系统预设目录(桌面、文档、图片、音乐等),避免硬编码路径导致的兼容性问题。

保存当前路径

用户选择图片后,截取文件所在目录,写入配置文件:

// 获取用户选择的文件完整路径
QString fileName = QFileDialog::getOpenFileName(this, "打开图片", lastPath, "图片文件(*.png *.jpg *.jpeg)");
// 截取目录(去掉文件名)
int endIndex = fileName.lastIndexOf("/");
QString currentPath = fileName.left(endIndex);
// 写入配置文件
pIni->setValue("lastPath/path", currentPath);

4. 内存管理优化

手动newQSettings对象必须释放,否则会造成内存泄漏:

// 手动释放
delete pIni;
pIni = nullptr;

更优雅的方式是使用C++11 智能指针****std::unique_ptr,无需手动释放,自动管理内存:

#include <memory>
// 智能指针管理QSettings
std::unique_ptr<QSettings> pIni = std::make_unique<QSettings>(iniPath, QSettings::IniFormat);

三、核心优化 2:默认路径锁定系统图片目录

传统图片查看器默认路径固定,用户需手动切换,我们直接将默认路径设为系统图片文件夹,通过QStandardPaths::PicturesLocation一键获取,无需手动配置,适配 Windows、Linux、macOS 全平台。

当配置文件无历史记录时,程序自动跳转到系统图片目录,开箱即用,降低用户操作成本。

四、核心优化 3:图片自适应控件显示

解决路径问题后,图片加载失真、无法适配控件大小的问题亟待解决。我们通过QPixmap的缩放功能,让图片完美适配显示控件。

// 加载图片
QPixmap* pix = new QPixmap(fileName);
// 获取显示标签的大小
QSize labelSize = ui->label->size();
// 图片自适应缩放,保持比例
QPixmap scaledPix = pix->scaled(labelSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
// 设置图片到标签
ui->label->setPixmap(scaledPix);
// 开启标签内容自适应
ui->label->setScaledContents(true);

关键参数说明:

  • Qt::KeepAspectRatio:保持图片宽高比,避免拉伸变形;
  • Qt::SmoothTransformation:平滑缩放,提升图片显示清晰度;
  • 图片加载后需手动delete pix,释放内存资源。

五、优化成果总结

经过三步核心优化,图片查看器实现了三大能力:

  1. 路径记忆:重启后直接定位上次打开目录,告别重复查找;
  2. 智能默认:默认打开系统图片目录,适配全平台;
  3. 自适应显示:图片自动适配控件大小,清晰不变形。

整个优化过程围绕用户体验展开,用 Qt 原生类实现轻量改造,代码简洁易维护,没有引入第三方依赖,完美解决了初始版本的所有痛点。后续还可以将路径存储升级为系统注册表,进一步提升配置的安全性,让工具更专业。

以上就是Qt使用QSetting记住上次打开路径的方法的详细内容,更多关于Qt QSetting记住上次打开路径的资料请关注脚本之家其它相关文章!

相关文章

  • 深入探究C++中的容器适配器与仿函数技术

    深入探究C++中的容器适配器与仿函数技术

    C++中的容器适配器和仿函数是实现数据结构与算法的重要技术,容器适配器可以将一个容器转换为另一个形式,仿函数则可以自定义数据类型的比较、排序、计算等行为,提高程序的灵活性和可重用性
    2023-04-04
  • 浅析操作系统中的虚拟地址与物理地址

    浅析操作系统中的虚拟地址与物理地址

    本文主要介绍了操作系统中的虚拟地址与物理地址。在早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存的呢
    2021-06-06
  • C语言数组实现三子棋应用实例

    C语言数组实现三子棋应用实例

    这篇文章主要为大家详细介绍了C语言数组实现三子棋应用实例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • C++内存泄漏的检测与实现详细流程

    C++内存泄漏的检测与实现详细流程

    内存泄漏(memory leak) 是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费
    2022-08-08
  • C++多线程std::call_once的使用

    C++多线程std::call_once的使用

    本文主要介绍了C++多线程std::call_once的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 推荐几款实用的C++ 在线工具

    推荐几款实用的C++ 在线工具

    这篇文章主要推荐了几款实用的C++ 在线工具,帮助大家更好的进行c++开发,感兴趣的朋友可以了解下载。
    2020-10-10
  • MATLAB Delaunay算法提取离散点边界的方法

    MATLAB Delaunay算法提取离散点边界的方法

    这篇文章主要为大家详细介绍了MATLAB Delaunay算法提取离散点边界的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • C++类与对象深入之静态成员与友元及内部类详解

    C++类与对象深入之静态成员与友元及内部类详解

    朋友们好,这篇播客我们继续C++的初阶学习,现在对我们对C++的静态成员,友元,内部类知识点做出总结,整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步
    2022-06-06
  • 解决pip install dlib报错C++11 is required to use dlib

    解决pip install dlib报错C++11 is required to use dlib

    这篇文章主要介绍了在使用pip install dlib安装dlib的时候报错C++11 is required to use dlib的解决方法,需要的的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • C++Fstream文件流与freopen重定向操作教程

    C++Fstream文件流与freopen重定向操作教程

    这篇文章主要介绍了C++Fstream文件流与freopen重定向教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论