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

chatgpt/2023/9/27 7:56:17

【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_OBJECTpublic: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.exyb.cn/news/show-5312844.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

❤️创意网页:贪吃蛇游戏 - 创造一个经典的小游戏

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

深入理解Java类加载机制中的双亲委派模型--根据源码探讨

前言&#xff1a; 今天和大家探讨一道Java中经典的面试题&#xff0c;这道面试题经常出现在各个公司的面试中&#xff0c;本篇文章主要讲解ava类加载机制中的双亲委派模型的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大…

无需魔法三分钟上线Midjourney应用,【附源码】【示例】

ps:我是标题党&#xff0c;目前还没见过三分钟完成任务的&#xff0c;三分钟只能打通Midjourney接口。我花了一天时间接入应用哈哈哈&#xff01; 首先&#xff0c;我要感谢laf赞助我&#xff0c;让我可以免费使用Midjourney进行开发和测试。来自白嫖党的快乐。 其次&#xff…

《kubernetes权威指南》-第一章学习笔记

1.什么是kubernetes&#xff1f; kubernetes是一个全新的基于容器技术的分布式架构领先方案。 2.为什么要用kubernetes&#xff1f; 使用kubernetes提供的解决方案能够减少30%的开发成本&#xff0c;并且能够将开发人员的精力更加集中于业务本身&#xff0c;同时可以降低系统…

tinkerCAD案例:29. New: Cruising with Shapes 新功能:与形状一起Cruising

tinkerCAD案例&#xff1a;29. New: Cruising with Shapes 新功能&#xff1a;与形状一起Cruising 原文&#xff1a;有动图演示 Stacking and assembling shapes has never been easier with Tinkercad’s new Cruise tool! 使用Tinkercad的Cruising工具堆叠和组装形状从未如…

【力扣周赛】第 356 场周赛(数位DP)

文章目录 Q1&#xff1a;6917. 满足目标工作时长的员工数目&#xff08;简单枚举模拟题&#xff09;Q2&#xff1a;6900. 统计完全子数组的数目&#xff08;双指针滑动窗口&#xff09;Q3&#xff1a;6918. 包含三个字符串的最短字符串Q4&#xff1a;6957. 统计范围内的步进数字…

python错误提示:AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

错误提示&#xff1a; AttributeError: ‘DataFrame’ object has no attribute ‘append’ 出现错误的代码&#xff1a; df_train_log pd.DataFrame() df_train_log df_train_log.append(log_train, ignore_indexTrue)原因&#xff1a; append包在pandas被弃用 解决方法&…

Python小红书旋转验证码识别

本周免费接了一个用户的需求&#xff0c;研究了一下小红书旋转验证码。刚开始小瞧了它&#xff0c;觉得它应该没有百度旋转验证码那么难&#xff0c;毕竟图像没有干扰&#xff0c;需要的训练样本就可以很少。然而事情并没有这么简单&#xff0c;所以记录一下。 首先看一下最终…
推荐文章