QT工程 插件模式开发 使用虚函数
1、新建DLL工程
下面是makedll工程的具体实现代码
//Dir D:\Study\dlltest\makedll\makedll.h
#ifndef MAKEDLL_H
#define MAKEDLL_H
#include <QObject>
#include "../../public/public.h"
class makedll : public QObject, Makedll
{
Q_OBJECT
Q_PLUGIN_METADATA(IID MakeId FILE "makedll.json")
Q_INTERFACES(Makedll)
public:
makedll(QObject *parent = 0);
void SetName(QString data) Q_DECL_OVERRIDE;
QString ReadName() Q_DECL_OVERRIDE;
};
#endif // MAKEDLL_H
//Dir D:\Study\dlltest\makedll\makedll.cpp
#include "makedll.h"
#include <QDebug>
makedll::makedll(QObject *parent)
{
}
void makedll::SetName(QString data)
{
qDebug() << "this dll SetName:" << data;
}
QString makedll::ReadName()
{
QString data = "this dll ReadName";
return data;
}
//Dir D:\Study\dlltest\makedll\makedll.pro
#-------------------------------------------------
#
# Project created by QtCreator 2020-12-07T19:40:37
#
#-------------------------------------------------
QT += core gui
TARGET = makedll
TEMPLATE = lib
CONFIG += plugin
DESTDIR = $$PWD/bin
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
SOURCES += makedll.cpp
HEADERS += makedll.h \
../public/public.h
DISTFILES += makedll.json
unix {
target.path = /usr/lib
INSTALLS += target
}
2、新建虚函数文件
// Dir D:\Study\dlltest\public\public.h
#ifndef PUBLIC_H
#define PUBLIC_H
#include <QString.h>
class Makedll
{
public:
virtual ~Makedll() {}
virtual void SetName(QString data) = 0;
virtual QString ReadName() = 0;
};
QT_BEGIN_NAMESPACE
#define MakeId "Makedll"
Q_DECLARE_INTERFACE(Makedll,MakeId)
QT_END_NAMESPACE
#endif // PUBLIC_H
3、新建Main工程
下面是使用DLL工程的具体方法
//Dir D:\Study\dlltest\usedll\main.cpp
#include <QCoreApplication>
#include "../../public/public.h"
#include <QDir>
#include <QtPlugin>
#include <QPluginLoader>
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Makedll * dll = nullptr;
QDir pluginDir(qApp->applicationDirPath());
foreach (QString filename, pluginDir.entryList(QDir::Files))
{
QPluginLoader plglder(pluginDir.absoluteFilePath(filename));
QObject * plugin = plglder.instance();
if(plugin)
{
dll = qobject_cast<Makedll*>(plugin);
if(dll)
{
break;
}
}
}
if(!dll)
{
return false;
}
qDebug() << dll->ReadName();
dll->SetName("this Main");
return a.exec();
}
//Dir D:\Study\dlltest\usedll\usedll.pro
QT += core
QT -= gui
CONFIG += c++11
TARGET = usedll
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS
# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
HEADERS += \
../public/public.h