【QT入门】图片查看软件(优化)

本文介绍了如何在Qt中实现图片查看器的优化,包括指定默认图片路径、记住上次打开路径以及图片自适应显示。通过使用QSettings和QStandardPaths管理配置和文件路径,展示了关键代码片段和优化策略。
摘要由CSDN通过智能技术生成

声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!)


往期回顾:

【QT入门】VS qt和QtCreator项目的相互转换-CSDN博客
【QT入门】Qt架构与三个窗口的区别-CSDN博客
【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"; 

  1.  qApp是一个全局指针,指向当前应用程序对象。
  2. applicationDirPath()是QApplication类中的一个函数,用于获取应用程序的目录路径。
  3. +是字符串连接操作符,用于连接两个字符串。
  4. "/config/Setting.ini" 是一个字符串,表示要连接的文件路径中的目录和文件名。
  5. 因此,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();

  1. 首先是创建了一个名为piniset的QSettings对象,用于读取指定路径下的.ini格式的配置文件。config_path是之前定义的配置文件路径。
  2. 然后从配置文件中读取名为/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));

  1. 相比之前的直接创建指针,这里创建了一个std::unique_ptr指向QSettings对象,该指针名为piniset。
  2. 通过使用std::unique_ptr来管理QSettings对象,可以确保在不再需要该对象时自动释放内存,避免内存泄漏问题。
  3. 如果是自己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);

}

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值