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