Unsolved QTplugin for beginner
-
@mrjj yeah,thank you very much...I will go through as u have guided.
-
plugin.pro: TEMPLATE = lib CONFIG += plugin release QT += widgets INCLUDEPATH += "C:\Users\Kits\Documents\testplugin\test\mainwindow" HEADERS += \ testit.h \ interface.h SOURCES += \ testit.cpp TARGET = $$qtLibraryTarget(testplugin) EXAMPLE_FILES = PluginS.json DISTFILES += \ PluginS.json mainwindow.pro: QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = testit TEMPLATE = app CONFIG = release # The following define makes your compiler emit warnings if you use # any feature of Qt which has 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 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ mainwindow.cpp HEADERS += \ mainwindow.h \ interface.h FORMS += \ mainwindow.ui QMAKE_PROJECT_NAME = mainwindow win32 { CONFIG(debug, release|debug):DESTDIR = ../debug/ CONFIG(release, release|debug):DESTDIR = ../release/ } else { DESTDIR = ../ } mainwindow.cpp: pluginsDir.cd("plugins"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); qDebug()<<plugin;
I am getting plugin value as a QObject(0x0).I think plugin is not getting loaded.
-
Hi
you do something like sample ?bool EchoWindow::loadPlugin() { QDir pluginsDir(qApp->applicationDirPath()); #if defined(Q_OS_WIN) if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") pluginsDir.cdUp(); #elif defined(Q_OS_MAC) if (pluginsDir.dirName() == "MacOS") { pluginsDir.cdUp(); pluginsDir.cdUp(); pluginsDir.cdUp(); } #endif pluginsDir.cd("plugins"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); if (plugin) { echoInterface = qobject_cast<EchoInterface *>(plugin); if (echoInterface) return true; } } return false; }
you should output
http://doc.qt.io/qt-5/qpluginloader.html#errorStringand see if it gives a hint
-
@mrjj
here i am getting error of:"Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/.qmake.stash'" QObject(0x0) "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/Makefile'" QObject(0x0) outside if "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/Makefile.Debug'" QObject(0x0) "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/Makefile.Release'" QObject(0x0) "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/ui_broadcastmsg.h'" QObject(0x0) "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-ServerWithPlugin-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/Server/ui_mainwindow.h'"
-
is that what errorString gives ?
-
@mrjj yes
-
Sorry. no idea. Google gives nothing.
Check against the sample.
Must be some difference since that works. -
@mrjj okay thanks
-
Might be silly question but I am stuck with it from very long at this point.
interface.h
#ifndef ECHOINTERFACE_H #define ECHOINTERFACE_H #include<QString> class EchoInterface { public: virtual ~EchoInterface() {} virtual QString echo(const QString &message) = 0; }; QT_BEGIN_NAMESPACE #define EchoInterface_iid "org.qt-project.Qt.Examples.EchoInterface" Q_DECLARE_INTERFACE(EchoInterface, EchoInterface_iid) QT_END_NAMESPACE #endif // ECHOINTERFACE_H
plugin_msg.h
#ifndef PLUGIN_MSG_H #define PLUGIN_MSG_H #include"echointerface.h" #include<QObject> class plugin_msg:public QObject,EchoInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" ) Q_INTERFACES(EchoInterface) public: QString echo(const QString &message); plugin_msg(); }; #endif // PLUGIN_MSG_H
error:
error: C2259: 'EchoInterface': cannot instantiate abstract class due to following members: 'QString EchoInterface::echo(const QString &)': is abstract : see declaration of 'EchoInterface::echo' : C2059: syntax error:'string'//Q_DECLARE_INTERFACE(EchoInterface,EchoInterface_iid) : 'QObject' should be preceded by ';' // in qobjectdef_imp.h file
what is wrong?
-
Hi
EchoInterface::echo is pure virtual.
That is indicated with the =0 in end of line
virtual QString echo(const QString &message) = 0;That means your subclass MUSt implement it.
do you have
plugin_msg:: echo(const QString &message) {
...
}in the .cpp for plugin_msg?
-
@mrjj yes
-
Hi,
There's no sign of declaration nor implementation of the
echo
method in the code you posted from yourplugin_msg
class. -
@SGaist
plugin_msg.h#ifndef PLUGIN_MSG_H #define PLUGIN_MSG_H #include"echointerface.h" #include<QObject> class plugin_msg:public QObject,EchoInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.EchoInterface" ) Q_INTERFACES(EchoInterface) public: QString echo(const QString &message); plugin_msg(); }; #endif // PLUGIN_MSG_H
plugin_msg.cpp
#include "pluginmsg.h" #include "plugin_msg.h" plugin_msg::plugin_msg() { } QString plugin_msg::echo(const QString &message) { return message; }
-
@SGaist @mrjj hey thanks.my problem of interface is solved by just adding #include<QObject> before all the includes file in plugin_msg.h
now again I'm getting the same old problem of' Can not load plugins'.
"Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-plug_testit-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/testitgui/Makefile'" "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-plug_testit-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/testitgui/Makefile.Debug'" "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-plug_testit-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/testitgui/Makefile.Release'" "Failed to extract plugin meta data from 'C:/Users/Kits/Documents/build-plug_testit-Desktop_Qt_5_10_1_MSVC2017_64bit-Release/testitgui/ui_mainwindow.h'"
-
-
@mrjj
mainwindow.cpp#include<QPluginLoader> bool MainWindow::loadplugin() { qDebug()<< qApp->applicationName(); pluginsDir = QDir(qApp->applicationDirPath()); qDebug()<<pluginsDir; #if defined(Q_OS_WIN) if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") pluginsDir.cdUp(); #elif defined(Q_OS_MAC) if (pluginsDir.dirName() == "MacOS") { pluginsDir.cdUp(); pluginsDir.cdUp(); pluginsDir.cdUp(); } #endif qDebug()<<"here.."<< pluginsDir.cd("plugins"); foreach (QString fileName, pluginsDir.entryList(QDir::Files)) { QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName)); QObject *plugin = pluginLoader.instance(); qDebug()<< pluginLoader.errorString(); if (plugin) { i = qobject_cast<interface *>(plugin); if (i) return true; } } return false; }
In analysis i found that
qDebug()<<"here.."<< pluginsDir.cd("plugins");
returns false.
but i don't know whether it creates "plugins" folder or it looks for the "plugins" folder already created or
Is it related to the DESTDIR in plugin.pro file.because in QT examples it automatically creates a folder named plugins in the build folder of the project, which isn't happening in my case.
plugin_msg.proTARGET =plugin_msg TEMPLATE = lib CONFIG += plugin QT += widgets INCLUDEPATH +="C:\Users\Kits\Documents\plugin_task\GUI_msg" HEADERS += \ plugin.h SOURCES += \ plugin.cpp TARGET = $$qtLibraryTarget(pnp_plugin) DESTDIR = "C:\Users\Kits\Documents\plugin_task\plugins" DISTFILES += \ Echoplugin.json
-
The loader you use , looks for the plugins in a folder next to .exe
and tried to go up and down depending on release and build.
and then tries to enter plugins.So check you do in fact have that folder in that location and it has the DLL file.
Alternatively, just load it directly with absolute path for test.
-
@mrjj thanks a lot for your answer and for the link https://suppsforlife.to/category/pct/
also wanted to say thanks to everyone for all your answers as they were super helpful for me, as a beginner. was wondering if i may talk with your privately guys? or I should start a thread? -
@Offied
Hi ( JadeN001 in office ?)
Please make posts versus asking chat.
Chat is bad for viewing code and nobody else can
see the questions / answers or help with info so
forum posts are always the best and help all the most.
I assume by privately you mean in chat and not something else:) -
By the way, did you try adding the .json file with the plugin metadata to your project ?