Qt 高级开发 008: 使用QSetting记住上次打开路径
- [Bilibili 同步视频](#Bilibili 同步视频)
- 一、前期准备:代码备份与方法拆分
- [二、核心优化 1:记住用户上次打开路径](#二、核心优化 1:记住用户上次打开路径)
- [三、核心优化 2:默认路径锁定系统图片目录](#三、核心优化 2:默认路径锁定系统图片目录)
- [四、核心优化 3:图片自适应控件显示](#四、核心优化 3:图片自适应控件显示)
- 五、优化成果总结
Bilibili 同步视频
在图片查看工具的开发过程中,我们总会遇到一些影响使用体验的小痛点:无法记忆用户上次打开的文件路径 、每次启动都固定在同一目录 、图片加载后不能自适应控件大小。这些看似细微的问题,却直接拉低了工具的实用性与流畅度。今天,我们就用 Qt 一步步攻克这三大难题,让图片查看器从 "能用" 升级为 "好用"✨。
一、前期准备:代码备份与方法拆分
在动手优化前,代码安全永远是第一位!我们先对原有的文件打开逻辑做完整备份,避免修改出错后无法回滚。同时,为了让逻辑更清晰,我们将打开功能拆分为多个独立方法,方便分步调试与迭代。
cpp
// 头文件中声明打开方法
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 所在目录,拼接出配置文件的完整路径:
cpp
// 获取exe所在目录
QString appPath = QApplication::applicationDirPath();
// 配置文件完整路径:debug/config/setting.ini
QString iniPath = appPath + "/config/setting.ini";
3. 用 QSettings 读写配置文件
Qt 提供的QSettings类是读写 ini 配置文件的利器,只需引入头文件,即可轻松实现键值对的存储与读取:
cpp
#include <QSettings>
读取上次路径
启动程序时,先从配置文件读取lastPath字段:
cpp
// 初始化配置文件对象
QSettings* pIni = new QSettings(iniPath, QSettings::IniFormat);
// 读取上次保存的路径
QString lastPath = pIni->value("lastPath/path").toString();
// 若首次打开无记录,设置默认路径
if (lastPath.isEmpty()) {
// 获取系统默认图片目录
lastPath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
}
这里用到QStandardPaths类,它能精准获取系统预设目录(桌面、文档、图片、音乐等),避免硬编码路径导致的兼容性问题✅。
保存当前路径
用户选择图片后,截取文件所在目录,写入配置文件:
cpp
// 获取用户选择的文件完整路径
QString fileName = QFileDialog::getOpenFileName(this, "打开图片", lastPath, "图片文件(*.png *.jpg *.jpeg)");
// 截取目录(去掉文件名)
int endIndex = fileName.lastIndexOf("/");
QString currentPath = fileName.left(endIndex);
// 写入配置文件
pIni->setValue("lastPath/path", currentPath);
4. 内存管理优化
手动new的QSettings对象必须释放,否则会造成内存泄漏:
cpp
// 手动释放
delete pIni;
pIni = nullptr;
更优雅的方式是使用C++11 智能指针****std::unique_ptr,无需手动释放,自动管理内存:
cpp
#include <memory>
// 智能指针管理QSettings
std::unique_ptr<QSettings> pIni = std::make_unique<QSettings>(iniPath, QSettings::IniFormat);
三、核心优化 2:默认路径锁定系统图片目录
传统图片查看器默认路径固定,用户需手动切换,我们直接将默认路径设为系统图片文件夹 ,通过QStandardPaths::PicturesLocation一键获取,无需手动配置,适配 Windows、Linux、macOS 全平台🌍。
当配置文件无历史记录时,程序自动跳转到系统图片目录,开箱即用,降低用户操作成本。
四、核心优化 3:图片自适应控件显示
解决路径问题后,图片加载失真、无法适配控件大小的问题亟待解决。我们通过QPixmap的缩放功能,让图片完美适配显示控件。
cpp
// 加载图片
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,释放内存资源。
五、优化成果总结
经过三步核心优化,图片查看器实现了三大能力:
-
路径记忆:重启后直接定位上次打开目录,告别重复查找;
-
智能默认:默认打开系统图片目录,适配全平台;
-
自适应显示:图片自动适配控件大小,清晰不变形。

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