Qt入门小项目 | 实现一个图片查看器

文章目录

  • 一、实现一个图片查看软件

一、实现一个图片查看软件

需要实现的功能:

  • 打开目录选择图片
  • 显示图片的名字
  • 显示图片

在以上功能的基础上进行优化,需要解决如下问题:

  • 如何记住上次打开的路径?

    将路径保存到配置文件中,当打开图片前,会首先读取配置文件

  • 如何指定默认的路径为文档/图片?
    QStandardPaths::PicturesLocation

  • 图片如何自适应显示?
    缩放到label的大小

     pix->scaled(ui->label_image->size(), Qt::KeepAspectRatio);  //图像的缩放ui->label_image->setScaledContents(true);   //QLabel会缩放其内部的图像或内容,以适应标签的尺寸
    

用到的Qt控件:

  • QLabel:用于显式文本与图片
  • QLineEdit:用于输入和编辑当行文本
  • QPushButoon:按钮

用到的特殊类:

  • QFileDialog:文件选择对话框,用于用户选择文件或目录,也可用来打开或保存文件

  首先,在Qt Designer中利用空间与布局进行设计

image-20240619205456346

ch1_7.pro文件

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();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 <QFileDialog>
#include <QSettings>
#include <QStandardPaths>
#include <memory>
#include <QDebug>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, "请选择图片", "C:/Users/85733/Desktop/", "图片(*.png *.jpg);;");if(fileName.isEmpty()){return;}//设置图片名称ui->lineEdit_path->setText(fileName);//显示图片ui->label_image->setPixmap(QPixmap(fileName));
}//优化的图片查看代码
void Widget::open2()
{//获取配置文件路径,这里需要手动创建/config/setting.ini配置文件QString config_path = qApp->applicationDirPath() + "/config/setting.ini";//打开配置文件并读取QSettings *pSetIni = new QSettings(config_path, QSettings::IniFormat);QString lastPath = pSetIni->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);   //QLabel会缩放其内部的图像或内容,以适应标签的尺寸ui->label_image->setPixmap(*pix);//记住上次打开的路径,保存到配置文件中-5int end = fileName.lastIndexOf("/");QString _path = fileName.left(end);pSetIni->setValue("/LastPath/path", _path);delete pix;pix = nullptr;delete pSetIni;pSetIni = nullptr;
}//使用智能指针进行优化
void Widget::open3()
{//获取配置文件路径,这里需要手动创建/config/setting.ini配置文件QString config_path = qApp->applicationDirPath() + "/config/setting.ini";//打开配置文件并读取std::unique_ptr<QSettings> pSetIni(new QSettings(config_path, QSettings::IniFormat));// QSettings *pSetIni = new QSettings(config_path, QSettings::IniFormat);QString lastPath = pSetIni->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);//显示图片std::unique_ptr<QPixmap> pix(new QPixmap(fileName));// QPixmap *pix = new QPixmap(fileName);pix->scaled(ui->label_image->size(), Qt::KeepAspectRatio);  //图像的缩放ui->label_image->setScaledContents(true);   //QLabel会缩放其内部的图像或内容,以适应标签的尺寸ui->label_image->setPixmap(*pix);//记住上次打开的路径,保存到配置文件中-5int end = fileName.lastIndexOf("/");QString _path = fileName.left(end);pSetIni->setValue("/LastPath/path", _path);// delete pix;// pix = nullptr;// delete pSetIni;// pSetIni = nullptr;
}void Widget::on_btnOpen_clicked()
{// open1();// open2();open3();
}

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}

运行结果

image-20240619220708651

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/30359.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用MAT定位线上OOM问题

目录 1.什么是OOM? 2.发生的可能原因 3.常见类型的OOM 4.如何定位问题&#xff1f; 4.1 获取dump文件 4.2 MAT分析 「Leak Suspects」泄露嫌疑 「Histogram」直方图 「dominator tree」支配树 「thread overview」线程视图 目录 1.什么是OOM? 2.发生的可能原因 …

深度学习入门5——为什么神经网络可以学习?

在理解神经网络的可学习性之前&#xff0c;需要先从数学中的导数、数值微分、偏导数、梯度等概念入手&#xff0c;从而理解为什么神经网络具备学习能力。 1.数值微分的定义 先从导数出发理解什么是梯度。某一点的导数直观理解就是在该点的切线的斜率。在数学中导数表示某个瞬…

05-对混合app应用中的元素进行定位

本文介绍对于混合app应用中的元素如何进行定位。 一、app的类型 1&#xff09;Native App&#xff08;原生应用&#xff09; 原生应用是指利用Android、IOS平台官方的开发语言、开发类库、工具等进行开发的app应用&#xff0c;在应用性能和交互体验上应该是最好的。 通俗点来…

Win10录屏,3种方法,快速搞定

在数字化时代&#xff0c;录屏功能已经成为了我们日常生活和工作中不可或缺的一部分。无论是为了制作教学视频&#xff0c;还是为了记录游戏的高光时刻&#xff0c;还是为了保存开会内容&#xff0c;录屏功能都能为我们提供极大的便利。Win10操作系统作为微软推出的经典之作&am…

在k8s中部署Elasticsearch高可用集群详细教程

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、为什么在k8s中部署elasti…

Redis 6.0新特性详解

Redis 6.0新特性主要有3个&#xff1a;多线程、Client Side Cache、Acls。下面详细说明一下。 1.多线程 redis 6.0 提供了多线程的支持&#xff0c;redis 6 以前的版本&#xff0c;严格来说也是多线程&#xff0c;只不过执行用户命令的请求时单线程模型&#xff0c;还有一些线…

鸿蒙HarmonyOS实战:状态管理和传值

状态管理 State State是一个装饰器&#xff0c;是用来存放数据的&#xff0c;比较好理解 由State的数据来进行状态驱动视图更新 代码很简单 State count: number 0; 需要注意的是State初始化的数据必须赋值 这里我们讨论简单用法&#xff0c;至于复杂的用法可以到项目中介绍…

RAG 流程及论文串烧

文档切片 文档切片的五个层次 https://medium.com/anuragmishra_27746/five-levels-of-chunking-strategies-in-rag-notes-from-gregs-video-7b735895694d#b123 Basic RAG 与 Advanced RAG https://pub.towardsai.net/advanced-rag-techniques-an-illustrated-overview-04d…

Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。

前言 这篇文章属于类知识的最后一篇&#xff0c;带一点点其他知识&#xff0c;学习内容来自于Python crash course。 关注我私信发送Python crash course&#xff0c;分享一份中文版PDF。 类的导入 在学习的时候&#xff0c;包括之前&#xff0c;我都是在一个文件中把所有代…

免费域名第二弹:手把手教你获取个性化免费域名并托管至Cloudflare

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 免费申请域名的方法 📒📝 注册账号📝 创建免费域名📝 将域名添加到 Cloudflare⚓️ 相关链接 ⚓️📖 介绍 📖 在如今的数字时代,拥有一个个性化的域名已经成为越来越多人的需求。无论是建立个人博客、项目展示,还…

鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】

有源标签 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import connectedTag from ohos.connectedTag;connectedTag.init init(): boolean 初始化有源标签芯片。 需要权限&#…

MySQL经典面试题:谈一谈你对事务的理解

文章目录 &#x1f4d1;事务事务的基本概念回滚开启事务的sql语句 事务的基本特性总结一下涉及到的三个问题 ☁️结语 &#x1f4d1;事务 事务的基本概念 事务是用来解决一类特定场景的问题的&#xff0c;在有些场景中&#xff0c;完成某个操作&#xff0c;需要多个sql配合完…

CPN IDE实现分层效果

Shift键鼠标选中要分层的库所和变迁&#xff01;然后create subpage。 Subpage是这样的&#xff0c;不会像CPN tools里面自动生成IN和OUT库所&#xff0c;但是也能正确运行。 虽然父页面在运行中有标红&#xff1a;"port not defined" 错误通常意味着在模型中有一些连…

【QT5】<重点> QT多线程

文章目录 前言 一、QThread创建多线程 二、QMutex基于互斥量的同步 三、QReadWriteLock线程同步 四、QWaitCondition线程同步 五、QSemaphore基于信号量的同步 前言 本篇记录学习QT多线程的知识&#xff0c;参考视频13.1QThread创建多线程程序_哔哩哔哩。若涉及版权问题…

单元测试很难么?

前言 你可能会用单元测试框架&#xff0c;python的unittest、pytest&#xff0c;Java的Junit、testNG等。 那么你会做单元测试么&#xff01;当然了&#xff0c;这有什么难的&#xff1f; test_demo.py def inc(x): return x 1 def test_answer(): assert inc(3) 4 i…

经验分享,CRC(循环冗余校验)在线计算

这里分享一个好用的在线计算CRC的网站。 网址&#xff1a;http://www.ip33.com/crc.html 截图&#xff1a;

Ubuntu22.04系统安装及配置

文章目录 一、选择“安装” 二、选择“语言” 三、安装器更新 四、键盘布局 五、选择安装类型 六、网络配置 七、代理设置 八、镜像地址 九、磁盘划分 十、设置用户名、主机名、登录密码 十一、升级到Ubuntu Pro 十二、SSH设置 十三、选装软件包 十四、开始安装进…

灰度图像直方图均衡化

文章目录 1.实验目的2.需求3.代码4.实验结果 1.实验目的 了解一种最基本的图像增强技术&#xff0c;本质上是对灰度图像进行灰度变换。 2.需求 对给定图像进行灰度直方图展示&#xff0c;然后均衡化后再次展示 3.代码 import cv2 as cv import numpy as np from matplotli…

类注释规范

类注释规范 1.1.1 模板配置 模板路径&#xff1a;File–>settings–>Editor–>File and Code Templates–>Includes–>File Header  N A M E &#xff1a;设置类名&#xff0c;与下面的 {NAME}&#xff1a;设置类名&#xff0c;与下面的 NAME&#xff1a;设…

【TB作品】MSP430G2553,单片机,口袋板, 多路温度巡回检测仪的设计

题7 多路温度巡回检测仪的设计 设计一个多路温度检测仪&#xff0c;共有8个测温点&#xff0c;每个点连续检测8次&#xff0c;以平均值代表该点温度&#xff0c;并轮流在LED显示器上显示。测试检测元件为铂热电阻Pt1000, 温度测量范围为100℃ ——500℃&#xff0c;测量精度为1…