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

简介: 转图标文件,外网有很多在线工具可以使用,但是内网有诸多不便,可以手动实现这样一个图片格式转换工具

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

核心代码

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

QImage img(sourcePath);

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

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

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

编写应用程序

1. 设计界面

imgconv.png

这里主界面继承自 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");
    }
}
目录
相关文章
|
5月前
|
Linux iOS开发 开发者
Qt问题(二):无法定位程序输入点于动态链接库
动态链接库(Dynamic Link Library,简称DLL)是一种可执行文件格式,常见于Windows操作系统中,而在Linux和macOS等其他操作系统中,相似的概念通常被称为共享库(Shared Library)。动态链接库允许程序在运行时加载所需的代码和数据,而不是在编译时静态链接到应用程序中。这种方式带来了几个重要的优点:
526 3
|
3月前
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
5月前
|
监控 Python
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
`pytest-qt` 是一个用于在 Qt 应用程序中进行 GUI 测试的 pytest 插件。
|
5月前
|
调度
【浅入浅出】Qt多线程机制解析:提升程序响应性与并发处理能力
在学习QT线程的时候我们首先要知道的是QT的主线程,也叫GUI线程,意如其名,也就是我们程序的最主要的一个线程,主要负责初始化界面并监听事件循环,并根据事件处理做出界面上的反馈。但是当我们只限于在一个主线程上书写逻辑时碰到了需要一直等待的事件该怎么办?它的加载必定会带着主界面的卡顿,这时候我们就要去使用多线程。
179 6
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
216 1
|
6月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
91 1
|
6月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
112 0
|
6月前
|
算法 计算机视觉
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
【Qt&OpenCV 图像边缘检测 Sobel/Laplace/Canny】
80 0