Unsolved QTplugin for beginner
-
well its never needed with both. ever :)
so something else.regarding:
broadcastplugin.json
you have to make it yourself. -
@mrjj I am new in this area,so can u guide me how to create a .json file!
-
I am really stuck in plugin.Can anyone suggest me the basic video/guideline of how to start with plugin for application. As based on qt documentation "echo-plugin" example
http://doc.qt.io/qt-5/qtwidgets-tools-echoplugin-example.html.
As a main project, which type of project should be chosen.how to create .json file for echo plugin(from QT Examples) which type of project I should choose. I am not getting clear idea from qt documentation.
Currently I am using "empty Qmake project " for echoplugin . -
@JadeN001
Just create the .json file
echoplugin.json
only contains {} ( empty json object ) and
that prevents the warning.You can use any template for plugin but "empty Qmake project " should be fine, but make sure you
add the needed stuff in .pro
most critical being
TEMPLATE = lib
CONFIG += pluginThere is also the old sample
https://doc.qt.io/archives/qt-5.10/qtwidgets-tools-plugandpaint-plugins-basictools-example.html
That shows a paint program that uses plugins to add brushes and pens. Not sure why its retired.why not copy echo sample and just change names ?
Most plugin code is the same for all plugins.
The only part that differ is names and and the actual feature code of the plugin. (what it does) -
@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