QT 插件开发的一些问题

本文探讨了Qt插件开发中关于QGenericPlugin头文件的使用,指出其实现并非完整接口,而是在实际项目中可以选择自定义接口。同时强调了接口文件在宿主项目和插件项目中保持一致的重要性,特别是在使用Q_DECLARE_INTERFACE宏声明接口时,避免因不一致导致的运行错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 关于头文件 QGenericPluginqgenericplugin.h

用Creator创建plugin工程时,有这一步 define project details 随后Creator就会创建几个文件,这些就不多说了。
看生成的test.h文件:

#ifndef TEST_H
#define TEST_H

#include <QGenericPlugin>

class test : public QGenericPlugin
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QGenericPluginFactoryInterface_iid FILE "untitled.json")

public:
    explicit test(QObject *parent = nullptr);

private:
    QObject *create(const QString &name, const QString &spec) override;
};

#endif // TEST_H

可以看到包含了QGenericPlugin,这个文件的路径是C:\Qt\5.15.2\mingw81_64\include\QtGui\QGenericPlugin,其内容只有一行

#include "qgenericplugin.h"

qgenericplugin.hQGenericPlugin位于同一目录下,其内容是

#ifndef QGENERICPLUGIN_H
#define QGENERICPLUGIN_H

#include <QtGui/qtguiglobal.h>
#include <QtCore/qplugin.h>
#include <QtCore/qfactoryinterface.h>

QT_BEGIN_NAMESPACE

#define QGenericPluginFactoryInterface_iid "org.qt-project.Qt.QGenericPluginFactoryInterface"

class Q_GUI_EXPORT QGenericPlugin : public QObject
{
    Q_OBJECT
public:
    explicit QGenericPlugin(QObject *parent = nullptr);
    ~QGenericPlugin();

    virtual QObject* create(const QString& name, const QString &spec) = 0;
};

QT_END_NAMESPACE

#endif // QGENERICPLUGIN_H

当然,这里定义的QGenericPlugin类并不是一个完整的interface,而官方文档以及许多文章里边说到interface的时候,也没有提到这两个文件。
在实际项目中选择包含QGenericPlugin,然后再派生出一个interface,还是自己重新定义一个完整的interface,并且使用一个自定义的新文件,其实都是可以的,这里只是提醒一下这个问题。

2. 关于接口的一致性

接口文件会存在于至少两个地方,一个是宿主项目中,一个是插件项目中,这时候就需要保证这两个地方的两个文件的一致性。
例如,在接口文件中,需要使用Q_DECLARE_INTERFACE宏来声明一个接口:
Q_DECLARE_INTERFACE(Interface, "Interface.Plugin.QT")
这一句声明在两个文件中必须是一致的,否则程序运行时就会出现一些错误,比方说段错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值