QT Image插件plugin编写

13 篇文章 2 订阅

QT Image插件编写

 

QT的QImage用过都知道,真香!工作中遇到一个情况,需要编写一个包装一个私有的图像格式,其实就是为了不让人随意引用,防个君子而已。如果能做成插件形式,修改个格式名称,那么就和以前的QImage一样了,其他部分根本用不着修改。

看了下,网上也有权威链接资料。见下面附录链接。

下面说一下简单的步骤:

简单说,由两种plugin,一种高级版,一种底层版。很明显底层版更难些,高级版的更方便入门。其实我们的大部分需求都是高级版,QT已经搭好了很好的框架,我们只要“完型填空”就可以了。图像类型imageFormat就属于这种,是典型高层需求,有完善的架构。我们来看下: 

项目搭建

打开QT
新建项目->选择library->C++库,(传统qt类型,不是quick)

 

类型,选QTPlugin
”类型“选择Qt Plugin

 

qimagioplugin
”基类“选择 QImageIOPlugin

 

这样构建了基础的框架。看一下这个构建好的pro文件

 

系统自动生成的还三样必须的东西才能构建。两个必须填写的虚函数,以及一个json配置文件。

//头文件
#ifndef IMAGEIOPLUGIN_H
#define IMAGEIOPLUGIN_H

#include <QImageIOPlugin>


class ImageIOPlugin : public QImageIOPlugin
{
    Q_OBJECT
#if QT_VERSION >= 0x050000
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QImageIOHandlerFactoryInterface" FILE "testPlugin.json")
#endif // QT_VERSION >= 0x050000


public:
    ImageIOPlugin(QObject *parent = 0);
//注意上面这句 Q_PLUGIN_METADATA,文件扩展名都在一个json配置文件内说明,并自动向qt系统注册。 
//上述都是自动生成,下面两个是自己临时填写的。这两个是必须填写的虚函数
public:
    Capabilities capabilities(QIODevice *device, const QByteArray &format) const override;
    QImageIOHandler *create(QIODevice *device, const QByteArray &format = QByteArray()) const override;
};

#endif // IMAGEIOPLUGIN_H




//代码文件,主要是先跑起来,加点调试信息
#include <QDebug>
#include "imageioplugin.h"


ImageIOPlugin::ImageIOPlugin(QObject *parent) :
    QImageIOPlugin(parent)
{
    qDebug() << "22a" << __FUNCTION__ ;
}

QImageIOPlugin::Capabilities ImageIOPlugin::capabilities(QIODevice *device, const QByteArray &format) const
{
    if (device){
        qDebug() << "22a" << __FUNCTION__ << "isOpen:" << device->isOpen()\
                 << "isRead:" << device->isReadable() \
                 << format;
    }
    else {
        qDebug() << "22a device is NULL" << format;

    }

    return (CanRead);
}

QImageIOHandler *ImageIOPlugin::create(QIODevice *device, const QByteArray &format) const
{
    qDebug() << __FUNCTION__ << "isOpen:" << device->isOpen()\
             << "isRead:" << device->isReadable() \
             << format;
    return NULL;
}

#if QT_VERSION < 0x050000
Q_EXPORT_PLUGIN2(testPlugin, ImageIOPlugin)
#endif // QT_VERSION < 0x050000

 

系统生成的plugin.json文件,有个问题,还需要加上mimeTypes才能写全,否则QImageReader::supportedImageFormats()和QImageReader::supportedMimeTypes()会查询不到你注册的图像类型。 

//json配置文件,mimeTypes需要自己添加,瞎写的,跑起来再说。

{
    "Keys" : ["22a", "22b"],
    "MimeTypes": [
        "image/22a", "image/22b"
    ]
}

 

构建成功以后,在imageformats目录里,就有dll/dxp等文件

QT的图像类型插件的结构图

插件结构图

 

QImageIOPlugin是一个factory类,QImageIOPlugin的主要工作不是“ImageIO”,而是Plugin。主要负责和qt的插件机制通信、注册。Image部分的话,QImageIOPlugin会首先被QImageReader调用询问,咨询QImageIOPlugin注册的文件类型是否支持,如果支持是支持读、写或全支持?

而QImageIOHandler是一个实际操作类,具体的文件读写由这个类完成。如果Plugin回答QImageReader支持该文件,那么Plugin会生成一个Handler,后续具体图像格式解码就由QImageIOHandler负责处理。

QImageIOHandler定义了一些基本的ImageOptions,这些options通过QVariant传递参数信息。这样我们在上层的QImage层面就能统一处理,就能方便地使用QImage这个类了。

真正处理Image格式的代码,都在QImageIOHandler的子类里。

 

发布和部署

一切都是自动的,甚至可以用static plugins的方式集成到程序内部。具体参见资料链接

 

注意。如果 qtplugin需要调用第三方dll,必须确保第三方dll在PATH目录内。

 

Writing a Qt Image Plugin

https://doc.qt.io/archives/qq/qq17-imageio.html

How to Create Qt Plugins

https://doc.qt.io/qt-5/plugins-howto.html

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt是一款跨平台的C++应用程序开发框架,支持各种GUI(图形用户界面)和非GUI应用程序开发。Qt提供了插件Plugin)机制,使开发者可以将应用程序的功能模块化,以实现灵活的插件化开发。 Qt插件机制允许开发者将应用程序的一部分功能独立封装成插件,并在运行时动态加载。这样的好处是插件可以在不重新编译整个应用程序的情况下进行更新或替换,极大地提升了开发效率和灵活性。 插件化开发中,Qt提供了一些关键的类和接口,包括QPluginLoader、QObject和Q_EXPORT_PLUGIN2等。首先,使用QPluginLoader类可以在运行时加载插件,并提供了查找和实例化插件的功能。其次,插件类需要派生自QObject类,并通过宏Q_OBJECT和Q_PLUGIN_METADATA来声明,以便Qt能够正确处理插件的元数据和信号槽机制。最后,Q_EXPORT_PLUGIN2宏用于导出插件类的实例,使其可以被QPluginLoader动态加载。 利用Qt插件机制,开发者可以将应用程序按功能划分为不同的插件模块,简化开发过程和项目维护。插件可以通过简单的配置文件进行注册和管理,实现插件的自动加载和卸载。另外,Qt的信号槽机制可以在插件之间进行通信和交互。这使得多个独立开发的插件可以灵活地协同工作,提供更丰富的功能和扩展性。 总结来说,Qt插件机制使得应用程序的功能模块化,提供了灵活的插件化开发方式。开发者可以通过动态加载和卸载插件,实现插件的更新和替换,提升开发效率和项目的可维护性。插件之间可以通过信号槽机制进行通信和交互,实现更丰富的功能和扩展性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值