QT插件创建与应用myplugin.rar-QT文档类资源-CSDN下载QT插件创建与应用myplugin.rarhttps://txwtech.blog.csdn.ne更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/txwtech/86732897?spm=1001.2014.3001.5503
Qt-插件创建参考
Qt-插件创建_Half-up的博客-CSDN博客_qt创建插件跟前面的章节一样,了解一下,会使用qt的插件Qt插件(Qt Plugin)就是一个共享库(dll文件),可以使用它进行功能的扩展。Qt中提供了两种API来创建插件:用来扩展Qt本身的高级API,如自定义数据库驱动,图片格式、文本编码和自定义风格等;用来扩展Qt应用程序的低级API。如果要写一个插件来扩展Qt本身,那么可以子类化合适的插件基类,然后重写一些函数并添加一个宏。可以通过在帮助中查看How to Create Qt Plugins关键字来了解本节的内容,这里还可以查看Qt提供的插件基https://blog.csdn.net/qq_35629971/article/details/124178763
创建应用程序插件 创建一个插件时,要先创建一个接口,接口就是一个类,它只包含纯虚函数。插件类要继承自该接口。插件类存储在一个共享库中,因此可以在应用程序运行时进行加载。创建一个插件包括以下几步:
定义一个插件类,它需要同时继承自QObject类和该插件所提供的功能对应的接口类; 使用Q_INTERFACES()宏在Qt的元对象系统中注册该接口; 使用Q_PLUGIN_METADATA()宏导出该插件; 使用合适的.pro文件构建该插件。 使一个应用程序可以通过插件进行扩展要进行以下几步:
定义一组接口(只有纯虚函数的抽象类);
使用Q_DECLARE_INTERFACE()宏在Qt的元对象系统中注册该接口;
在应用程序中使用QPluginLoader来加载插件;
使用qobject_cast()来测试插件是否实现了给定的接口。
下面通过创建一个过滤字符串中出现的第一个数字的插件来讲解应用程序插件的创建过程。
这里需要创建两个项目,一个项目用来生成插件,即dll文件;另一个项目是一个测试程序﹐用来使用插件。
因为这两个项目中有共用的文件,所以这里将它们放到一个目录中。 ————————————————
#ifndef REGEXPPLUGIN_H
#define REGEXPPLUGIN_H
#include
#include "regexpinterface.h"
class RegExpPlugin:public QObject,RegExpInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "org.qter.Examples.myplugin.RegExpInterface" FILE "myplugin.json")
Q_INTERFACES(RegExpInterface)
public:
// RegExpPlugin();
QString regexp(const QString &message);
};
#endif // REGEXPPLUGIN_H
#include "regexpplugin.h"
#include
#include
QString RegExpPlugin::regexp(const QString &message)
{
QRegExp rx("\\d+");
rx.indexIn(message);
QString str=rx.cap(0);
return str;
}
应用:
#ifndef REGEXPINTERFACE_H
#define REGEXPINTERFACE_H
#include
#include
class RegExpInterface
{
public:
// RegExpInterface();
virtual ~RegExpInterface(){}
virtual QString regexp(const QString &message) = 0;
};
Q_DECLARE_INTERFACE(RegExpInterface,
"org.qter.Examples.myplugin.RegExpInterface")
#endif // REGEXPINTERFACE_H
#ifndef WIDGET_H
#define WIDGET_H
#include "regexpinterface.h"
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_filter_clicked();
private:
Ui::Widget *ui;
RegExpInterface *regexpInterface2;
bool loadPlugin();
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
if(!loadPlugin())
{
QMessageBox::information(this,"Error","could not load this plugin");
ui->lineEdit->setEnabled(false);
ui->pushButton_filter->setEnabled(false);
}
}
Widget::~Widget()
{
delete ui;
}
bool Widget::loadPlugin()
{
//QDir pluginsDir("./plugins"); //exe文件exe文件夹Debug与plugins在相同目录,当前目录
// QDir pluginsDir("../plugins");//exe文件夹Debug目录的上一级目录
QDir pluginsDir("../../plugins");//exe文件exe文件夹Debug目录的上上一级目录
foreach(QString fileName,pluginsDir.entryList(QDir::Files))
{
QPluginLoader plugin_loader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin=plugin_loader.instance();
if(plugin)
{
regexpInterface2 =qobject_cast(plugin);
if(regexpInterface2)
{
return true;
}
}
}
return false;
}
void Widget::on_pushButton_filter_clicked()
{
QString str=regexpInterface2->regexp(ui->lineEdit->text());
ui->labelNum->setText(str);
}