声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!)
往期回顾:
【QT入门】VS qt和QtCreator项目的相互转换-CSDN博客
【QT入门】Qt架构与三个窗口的区别-CSDN博客
【QT入门】实现一个简单的图片查看软件-CSDN博客
注:此优化是在原本图片查看器基础上的,如未看过的可以先看看:
【QT入门】图片查看软件(优化)
本次优化主要是针对三个方面的优化,分别是:
1、如何指定默认的路径为文档/图片?
2、如何记住,上次打开的路径?
3、图片自适应显示?
下面一一分析完善:
一、如何指定默认的路径为文档/图片?
1、思路:
要实现指定默认的打开路径,也就是说每次点击打开按钮,弹出的文件选择窗口是指定好的,如何实现这个效果呢?
我们需要创建一个ini文件来存放每次打开的路径,然后我们就可以直接去读这个文件里存放的路径,第一次打开的时候里面肯定是空的,我们就可以加一个判断,如果为空,就先赋一个初值(也就是我们希望的默认路径),这个时候,我们就实现了,指定默认的路径。
为什么用ini文件?
INI文件通常包含一系列的节(section)和键值对(key-value pairs)。每个节用方括号括起来,包含一组相关的键值对。键值对由键和值组成,用等号或冒号分隔。
2、部分代码分析
1、 QString config_path=qApp->applicationDirPath()+"/config/Setting.ini";
- qApp是一个全局指针,指向当前应用程序对象。
- applicationDirPath()是QApplication类中的一个函数,用于获取应用程序的目录路径。
- +是字符串连接操作符,用于连接两个字符串。
- "/config/Setting.ini" 是一个字符串,表示要连接的文件路径中的目录和文件名。
- 因此,config_path变量将包含一个完整的文件路径,指向应用程序的目录中的Setting.ini配置文件。
综上所述:这行代码创建了一个QString类型的变量config_path,用于存储一个文件路径。该文件路径是通过将应用程序的目录路径和一个名为Setting.ini的配置文件名连接而成的。
2、QSettings *piniset = new QSettings(config_path,QSettings::IniFormat);
QString lastpath = piniset->value("/lastpath/path").toString();
- 首先是创建了一个名为piniset的QSettings对象,用于读取指定路径下的.ini格式的配置文件。config_path是之前定义的配置文件路径。
- 然后从配置文件中读取名为/lastpath/path的配置项的值,并将其转换为字符串类型。这个值将保存在lastpath变量中。
综上所述:这段代码的作用是使用QSettings类读取一个.ini格式的配置文件,并从中获取名为/lastpath/path的配置项的值。
3、代码实现
void Widget::clicked02()
{
//把每次访问的文件路径存到setting.ini这个文件里
QString config_path=qApp->applicationDirPath()+"/config/Setting.ini";
qDebug()<<config_path;
//如何去读取setting.ini这个文件?用一个类叫QSettings
//构造QSettings类,参数为文件路径和格式
QSettings *piniset = new QSettings(config_path,QSettings::IniFormat);
//用指针读取这个文件地址然后转string赋值给lastpath
//为什么这里写"/lastpath/path",因为在config文件夹里写的就是这个
QString lastpath = piniset->value("/lastpath/path").toString();
//如果为空就给他一个默认值,但是第一次肯定是空的
//是空的就给他一个值,给什么值呢?给电脑默认的图片位置路径
//有一个类QStandardPaths,他的一个枚举值就是指电脑的图片位置路径
if(lastpath.isEmpty())
{
lastpath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
}
//打开目录选择图片,静态函数,可以直接父类名在前去调用,参数分别是父类指针,选择提示语,文件路径,过滤器(过滤文件类型)等,具体的看笔记
QString filename = QFileDialog::getOpenFileName(this,"请选择图片",lastpath,"图片(*.png *.jpg);;");
//获取到文件名字以后,直接放进去,不过放进去之前可以先进行一个简单的非空判断
if(filename.isEmpty())
{
return;
}
ui->lineEdit_image->setText(filename);
//
ui->label_photo->setPixmap(QPixmap(filename));
}
二、如何记住,上次打开的路径?
1、思路:
我们上面说了,创建了一个ini文件来存储路径,最开始赋了一个初值,也就是电脑的图片存放路径
现在我们怎么让程序记住上次打开的路径呢?我们可以先提取出上次打开的路径,对于filename来说,肯定是”c:/xxx/xxx/xxx/x.png“类型,我们就提取最后一个”/“之前的路径,也就是图片所在文件夹,也就是上次打开的路径了,拿出来赋值给ini文件,那么下次打开的时候,就会是上次的路径了。(因为打开的时候默认选取ini文件里的)
2、部分代码分析
1、QPixmap *pix = new QPixmap(filename);
创建了一个QPixmap指针pix,并通过new运算符从文件filename加载了一个图片。
2、pix->scaled(ui->label_photo->size(), Qt::KeepAspectRatio);
调用scaled函数对图片进行缩放,但此处缺少将缩放后的结果保存的步骤。scaled函数会返回一个新的QPixmap对象,因此应该将返回值赋给pix指针以保存缩放后的图片。
QPixmap pix01 =pix->scaled(ui->label_photo->size(),Qt::KeepAspectRatio);
上面这个写法会更好一点
3、ui->label_photo->setScaledContents(true); 设置label_photo
设置label_photo控件的内容自适应缩放,以便显示缩放后的图片。
拓展:智能指针
std::unique_ptr<QSettings> piniset(new QSettings(config_path,QSettings::IniFormat));
- 相比之前的直接创建指针,这里创建了一个std::unique_ptr指向QSettings对象,该指针名为piniset。
- 通过使用std::unique_ptr来管理QSettings对象,可以确保在不再需要该对象时自动释放内存,避免内存泄漏问题。
- 如果是自己new的指针,最后是需要delete 指针,并指针=nullptr置空的
3、代码实现
//把每次访问的文件路径存到一个文件夹里
QString config_path=qApp->applicationDirPath()+"/config/Setting.ini";
qDebug()<<config_path;
std::unique_ptr<QSettings> piniset(new QSettings(config_path,QSettings::IniFormat));
//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_image->setText(filename);
//先单独把指针new出来,并读取filenamemu'l 加载图片
QPixmap *pix=new QPixmap(filename);
//调用scaled函数对图片进行缩放,缩放到label_photo这个控件的大小,后面加一个抗锯齿的参数
//此处缺少将缩放后的结果保存的步骤。scaled函数会返回一个新的QPixmap对象,因此应该将返回值赋给pix指针以保存缩放后的图片。
//QPixmap pix01 =pix->scaled(ui->label_photo->size(),Qt::KeepAspectRatio);
pix->scaled(ui->label_photo->size(),Qt::KeepAspectRatio);
//设置label_photo控件的内容自适应缩放,以便显示缩放后的图片。
ui->label_photo->setScaledContents(true);
//图片自适应应该在pixmap之前做,也就是图片最终展示之前
//如果保存了缩放后的图片,na么此处应该是ui->label_photo->setPixmap(pix01);
ui->label_photo->setPixmap(*pix);
//pix指针是new出来的,所以也要释放,避免内存泄漏。
delete pix;
pix=nullptr;
int end=filename.lastIndexOf("/");
QString _path = filename.left(end);
piniset->setValue("/lastpath/",_path);
//delete pIniSet;
//pIniSet = nullptr;
qDebug()<< _path;
三、最终代码
上面的代码注释写的还算详细,大家可以多看看,但是最后还是建议大家不看注释不看笔记,自己敲一遍代码,看看每行代码是不是都理解了。
void Widget::clicked08()
{
//:如何指定默认的路径为文档/图片?
QString config_path=qApp->applicationDirPath()+"/config/Setting.ini";
std::unique_ptr <QSettings> piniset(new QSettings(config_path,QSettings::IniFormat));
QString lastpath =piniset->value("/lastpath/path").toString();
if(lastpath.isEmpty())
{
lastpath = QStandardPaths::writableLocation(QStandardPaths::PicturesLocation);
}
qDebug()<<lastpath;
QString filename= QFileDialog::getOpenFileName(this,"请选择图片",lastpath,"图片(*.png *.jpg)");
if(filename.isEmpty())
{
return;
}
ui->lineEdit_image->setText(filename);
//:图片自适应显示?
std::unique_ptr <QPixmap> pix(new QPixmap(filename));
pix->scaled(ui->label_photo->size(),Qt::KeepAspectRatio);
ui->label_photo->setScaledContents(true);
ui->label_photo->setPixmap(*pix);
//:如何记住,上次打开的路径?
int end =filename.lastIndexOf("/");
QString _path= filename.left(end);
piniset->setValue("/lastpath/path",_path);
}
都看到这里了,点个赞再走呗朋友~
加油吧,预祝大家变得更强!