【Qt】Qt 实现图像格式转图标 ico 格式的程序

news2024/9/21 18:38:37

【Qt】Qt 实现图像格式转图标 ico 格式的程序

文章目录

  • 【Qt】Qt 实现图像格式转图标 ico 格式的程序
    • 核心代码
    • 编写应用程序
      • 1. 设计界面
      • 2. 头文件
      • 3. 源文件

核心代码

此程序得核心代码既是,使用 QImage 打开图片文件,并保存为 ICO 格式。

QImage img(sourcePath);

if (img.save(destinationPath, "ICO"))
{
	qDebug() << "success";
}
else
{
	qDebug() << "failure";
}

将上述代码中的 sourcePath 和 destinationPath 分别替换为原图片的路径和生成位置的路径。
如果仅仅是为了完成图片格式转换,到这里就可以止步了。

以下内容是为了编写一个应用程序,方便多次使用。

编写应用程序

1. 设计界面

在这里插入图片描述
这里主界面继承自 QDialog,有三部分组成,最上方,两个 QLineEdit 用于放置原图片路径,和生成路径,以及用于浏览选择位置的两个按钮,这里将他们命名为 srcPath, destPath, btnSrcBrowe, btnDestBrowse。

第二部分,一个 Horizontal SpacerQPushButton,按钮用于触发转换,命名为 btnConvert

第三部分,一个 QTextEdit ,用于显示是否转换成功,命名为 console

2. 头文件

这里使用的是 Visual Studio + Qt plugin 的方式,在 Visual Studio 上的开发,个别头文件与原生 Qt 可能不太相同。

头文件中可以看到 ImageConverter 类继承自 QDialog,这里除了 Ui 没有存储任何的私有变量,为了简洁,省去了非必要的多个成员变量的维护和与界面同步的问题。

#pragma once

#include <QtWidgets/QDialog>
#include "ui_ImageConverter.h"

class ImageConverter : public QDialog
{
	Q_OBJECT

public:
	ImageConverter(QWidget *parent = Q_NULLPTR);

private slots:
	void HandleBtnSrcBrowseClicked();
	void HandleBtnDestBrowseClicked();
	void HandleBtnConvertClicked();

private:
	Ui::ImageConverterClass ui;
};

这里仅需要声明三个槽函数,用于响应三个按钮的点击事件。

3. 源文件

首先,包含头文件

#include "ImageConverter.h"
#include <QPushButton>
#include <QFileDialog>
#include <QImage>
  • 本类的头文件自然不必赘述
  • 包含 <QPushButton> 用于绑定按钮信号 clicked ,到槽函数中
  • 包含 <QFileDialog> 用于浏览图片位置和保存图标位置
  • 包含 <QImage> 为了使用 QImage 自带的转换

构造函数,setWindowTitle 用于设置标题栏名称,然后使用 Qt5 的 connect ,绑定函数指针,来连接信号槽。

ImageConverter::ImageConverter(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	this->setWindowTitle("Image Converter");

	connect(ui.btnSrcBrowse, &QPushButton::clicked, this, &ImageConverter::HandleBtnSrcBrowseClicked);
	connect(ui.btnDestBrowse, &QPushButton::clicked, this, &ImageConverter::HandleBtnDestBrowseClicked);
	connect(ui.btnConvert, &QPushButton::clicked, this, &ImageConverter::HandleBtnConvertClicked);
}

浏览原图片按钮槽函数,这里用到了 QFileDialog 的静态函数 getOpenFileName , 给了两个实参,第一个 this 用于设置父窗口,第二个 "Select an image ..." 用于设置文件对话框的标题栏。

void ImageConverter::HandleBtnSrcBrowseClicked()
{
	QString filepath = QFileDialog::getOpenFileName(this, "Select an image ...");
	if (filepath.isEmpty())
	{
		return;
	}

	ui.srcPath->setText(filepath);
	ui.destPath->setText(QFileInfo(filepath).absolutePath().append("/").append(QFileInfo(filepath).baseName().append(".ico")));
}

文件对话框,选择完毕点击确定,会将文件路径返回到 filepath 中,若对话框关闭未选择,则会返回一个空字符串,if 判断检测为空的情况下,不向下继续进行。

若获取到文件路径,则在显示源路径在界面上,同时显示目标路径到界面上,使用 QFileInfo 为了获取原图片的绝对路径 (absolutePath()) 和文件名 (baseName()),将后缀名改为 ico,拼接上去


响应浏览目标路径按钮的槽函数,首先检测源路径是否已经设置,若未设置则将目标文件名命名为 untitled.ico , 若已设置,则如之前函数一样,获取文件名添加后缀名

void ImageConverter::HandleBtnDestBrowseClicked()
{
	QString name = ui.srcPath->text();
	if (name.isEmpty())
	{
		name = "untitled.ico";
	}
	else
	{
		name = QFileInfo(name).baseName().append("ico");
	}

	QString filepath = QFileDialog::getSaveFileName(this, "Save icon file ...", name, tr("Images (*.ico)"));

	ui.destPath->setText(filepath);
}

这里使用了 QFileDialog::getSaveFileName 设置默认的保存名称为 name
第一个参数:父对象,
第二个参数:窗口名称,
第三个参数:文件名,也可以是保存路径,也可以是保存路径+文件名(例如:QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)+“shotnum”)

第四个参数:过滤器


响应转换按钮的槽函数, 这里获取两个路径,然后使用核心代码,如果保存成功则在 QTextEdit 上显示 success, 否则显示 conversion failure

void ImageConverter::HandleBtnConvertClicked()
{
	QString srcpath = ui.srcPath->text();
	QString destpath = ui.destPath->text();

	QImage img(srcpath);
	if (img.save(destpath, "ICO"))
	{
		ui.console->append("success");
	}
	else
	{
		ui.console->append("conversion failure");
	}
}

完整源文件代码

#include "ImageConverter.h"
#include <QPushButton>
#include <QFileDialog>
#include <QImage>

ImageConverter::ImageConverter(QWidget *parent)
	: QDialog(parent)
{
	ui.setupUi(this);
	this->setWindowTitle("Image Converter");

	connect(ui.btnSrcBrowse, &QPushButton::clicked, this, &ImageConverter::HandleBtnSrcBrowseClicked);
	connect(ui.btnDestBrowse, &QPushButton::clicked, this, &ImageConverter::HandleBtnDestBrowseClicked);
	connect(ui.btnConvert, &QPushButton::clicked, this, &ImageConverter::HandleBtnConvertClicked);
}

void ImageConverter::HandleBtnSrcBrowseClicked()
{
	QString filepath = QFileDialog::getOpenFileName(this, "Select an image ...");
	if (filepath.isEmpty())
	{
		return;
	}

	ui.srcPath->setText(filepath);
	ui.destPath->setText(QFileInfo(filepath).absolutePath().append("/").append(QFileInfo(filepath).baseName().append(".ico")));
}

void ImageConverter::HandleBtnDestBrowseClicked()
{
	QString name = ui.srcPath->text();
	if (name.isEmpty())
	{
		name = "untitled.ico";
	}
	else
	{
		name = QFileInfo(name).baseName().append("ico");
	}

	QString filepath = QFileDialog::getSaveFileName(this, "Save icon file ...", name, tr("Images (*.ico)"));

	ui.destPath->setText(filepath);
}

void ImageConverter::HandleBtnConvertClicked()
{
	QString srcpath = ui.srcPath->text();
	QString destpath = ui.destPath->text();

	QImage img(srcpath);
	if (img.save(destpath, "ICO"))
	{
		ui.console->append("success");
	}
	else
	{
		ui.console->append("conversion failure");
	}
}

运行界面如图所示

在这里插入图片描述

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

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

相关文章

Stable Diffusion 硬核生存指南:WebUI 中的 VAE

本篇文章聊聊 Stable Diffusion 生态中呼声最高、也是最复杂的开源模型管理图形界面 “stable-diffusion-webui” 中和 VAE 相关的事情。 写在前面 Stable Diffusion 生态中有一个很重要的项目&#xff0c;它对于 SD 生态繁荣做出的贡献可以说居功至伟&#xff0c;自去年八月…

操作系统_进程与线程(二)

目录 2. 处理机调度 2.1 调度的基本概念 2.2 调度的层次 2.3 三级调度的联系 2.4 调度的目标 2.5 调度的实现 2.5.1 调度程序&#xff08;调度器&#xff09; 2.5.2 调度的时机、切换与过程 2.5.3 进程调度方式 2.5.4 闲逛进程 2.5.5 两种线程的调度 2.6 典型的调度…

服务调用---------Ribbon和Feign

1、Ribbon 1.1 Ribbon简介 Ribbon是一个用于客户端负载均衡的组件&#xff0c;它是Netflix开源的一个项目。在微服务架构中&#xff0c;系统会拆分为多个小型的服务&#xff0c;每个服务都有自己独立的服务器实例。Ribbon所具有的特点&#xff1a;客户端负载均衡&#xff0c;将…

批量插入数据、MVC三层分离

八、批量插入数据 1、使用Statement&#xff08;&#xff09; 2、使用PreparedStatement() 3、使用批量操作API 4、优化 九、MVC三层分离

Java中static关键字的作用

文章目录 一、使用static关键字修饰成员变量&#xff1a;二、使用static关键字修饰成员方法&#xff1a;三、使用static关键字定义静态代码块&#xff1a;四、使用static关键字定义内部类&#xff1a;五、使用静态导包&#xff1a;六、总结&#xff1a;static关键字在Java中有多…

大数据课程D7——hadoop的YARN

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解YARN的概念和结构&#xff1b; ⚪ 掌握YARN的资源调度流程&#xff1b; ⚪ 了解Hadoop支持的资源调度器&#xff1a;FIFO、Capacity、Fair&#xff1b; ⚪ 掌握YA…

Python语法(一、基础)

简介 Python 是一个高层次的结合了解释性、交互性和面向对象的脚本语言。解释型语言&#xff1a; 这意味着开发过程中没有了编译这个环节。作为解释型语言&#xff0c;意味着开发过程中没有了编译这个环节&#xff0c;对代码逐行解析。 Python还具有可嵌入性&#xff0c;如Py…

ConcurrentHashMap基本介绍

介绍 ConcurrentHashMap是线程安全且高效的HashMap。 为什么要使用ConcurrentHashMap 线程不安全的HashMap HashMap多线程情况下put操作会出现并发安全问题&#xff0c;包括死循环、数据丢失&#xff08;jdk7&#xff09;以及数据覆盖&#xff08;jdk8&#xff09;。 jdk7中…

基于stm32单片机的直流电机速度控制——LZW

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验目的二、实验方法三、实验设计1.实验器材2.电路连接3.软件设计&#xff08;1&#xff09;实验变量&#xff08;2&#xff09;功能模块a&#xff09;电机接收信号…

Github git clone 和 git push 特别慢的解决办法

1.在本地上使用 SSH 命令无法git push 上传 github 项目 2.使用 git clone 下载项目特别慢总是加载不了 解决办法1 将 *** 的连接模式换成&#xff1a;D-i-r-e-c-t&#xff08;好像不太有用&#xff09; 后面再找找能不能再G-l-o-b-a-l 下解决该问题 解决办法 2 mac下直接设…

Python 日志记录:6大日志记录库的比较

Python 日志记录&#xff1a;6大日志记录库的比较 文章目录 Python 日志记录&#xff1a;6大日志记录库的比较前言一些日志框架建议1. logging - 内置的标准日志模块默认日志记录器自定义日志记录器生成结构化日志 2. Loguru - 最流行的Python第三方日志框架默认日志记录器自定…

SpringBoot内嵌的Tomcat:

SpringBoot内嵌Tomcat源码&#xff1a; 1、调用启动类SpringbootdemoApplication中的SpringApplication.run()方法。 SpringBootApplication public class SpringbootdemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootdemoApplicat…

python浅浅替代ps?实现更改照片尺寸,以及更换照片底色

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如何用代码来p证件照并且更换底色&#xff1f; 有个小姐姐给我扔了张照片&#xff0c;叫我帮忙给她搞成证件照的尺寸还得换底色 可惜电脑上没有ps只有pycharm&#xff0c;但下载又卸载多麻烦呀 于是&#xff0c;我就用代码来…

RT1052 的周期定时器

文章目录 1 PIT 周期中断定时器2 PIT定时器的使用3 PIT定时器配置3.1 PIT 时钟使能。3.1.1 CLOCK_EnableClock 3.2 初始化 PIT 定时器3.2.1 PIT_Init 3.3 设置 通道 0 的 加载值3.3.1 PIT_SetTimerPeriod 3.4 使能 通道 0 的中断3.4.1 PIT_EnableInterrupts 3.5 开启 PIT 定时器…

在登录界面中设置登录框、多选项和按钮(HTML和CSS)

登录框&#xff08;Input框&#xff09;的样式&#xff1a; /* 设置输入框的宽度和高度 */ input[type"text"], input[type"password"] {width: 200px;height: 30px; }/* 设置输入框的边框样式、颜色和圆角 */ input[type"text"], input[type&q…

测试|测试分类

测试|测试分类 文章目录 测试|测试分类1.按照测试对象分类&#xff08;部分掌握&#xff09;2.是否查看代码&#xff1a;黑盒、白盒灰盒测试3.按开发阶段分&#xff1a;单元、集成、系统及验收测试4.按实施组织分&#xff1a;α、β、第三方测试5.按是否运行代码&#xff1a;静…

100行代码写一个简易QT点名程序

照例演示一下: 分享一个简易的Qt点名程序&#xff0c;满打满算一百行代码&#xff08;还要什么自行车&#xff09;。 UI界面比较丑&#xff0c;按钮是自己做的&#xff0c;背景是AI作画生成的&#xff0c;大家可以自行更换背景以及按钮。 内容也是非常的简单&#xff0c;就是…

JWT登录认证

JWT认证流程 跨域认证解决方案&#xff0c;JWT的流程为&#xff1a; 客户端发送账号和密码请求服务端收到请求&#xff0c;验证用户名密码是否通过验证成功后&#xff0c;服务端会生成唯一的token&#xff0c;将其返回给客户端客户端收到token&#xff0c;会将其存储在cookie…

拓扑排序详解(带有C++模板)

目录 介绍&#xff1a; 实现原理&#xff1a; 简答来说&#xff1a; 例子 模板&#xff08;C&#xff09; 介绍&#xff1a; 拓扑排序&#xff08;Topological Sorting&#xff09;是一种针对有向无环图&#xff08;DAG&#xff09;的节点进行排序的算法。DAG是一个图&…

Android 之 使用 MediaRecord 录音

本节引言 本节是Android多媒体基本API调用的最后一节&#xff0c;带来的是MediaRecord的简单使用&#xff0c; 用法非常简单&#xff0c;我们写个例子来熟悉熟悉~ 1.使用MediaRecord录制音频 运行结果&#xff1a; 实现代码&#xff1a; 布局代码&#xff1a;activity_main.…