Как использовать классы хост-приложения из плагина Qt?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать классы хост-приложения из плагина Qt?

Сообщение Anonymous »

У меня возникли проблемы со связыванием при создании плагина Qt C++ для расширения функциональности моего приложения. Код компилируется, и все работает, но только до тех пор, пока я использую классы библиотеки Qt, например QString. В тот момент, когда я даю классу плагина ссылку на объект из классов, определенных в хост-приложении, проект больше не связан. Создавая плагин, я следую процедуре из документации Qt и принимаю во внимание приведенные примеры — echo и plug&paint. Однако такой случай там не описан.



обновление

Вот ошибка:


myPlugin.obj:-1: ошибка: LNK2019: неразрешенный внешний символ "public: class QString __cdecl myClass ::ответ(недействительный)const " (?answer@myClass@@QEBA?AVQString@@XZ), на который ссылается функция "public: виртуальный класс QString __cdecl myPlugin::echo(class myClass *)" (?echo@myPlugin@@UEAA?AVQString@@PEAVmyClass@@@ Z)


И вот проект, который это вызывает:

plugtest.pro

TEMPLATE = subdirs

SUBDIRS += \
host \
plugin


host.pro

QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = host
TEMPLATE = app

SOURCES += main.cpp\
MainWindow.cpp \
myClass.cpp

HEADERS += MainWindow.h \
myClass.h \
plugInterface.h

FORMS += MainWindow.ui


MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include
#include
#include "myClass.h"
#include "plugInterface.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void on_button_clicked();

private:
bool loadPlugin();

Ui::MainWindow *ui;

plugInterface *m_interface;

myClass *m_class;
};

#endif // MAINWINDOW_H


myClass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include

class myClass : public QObject
{
Q_OBJECT
public:
explicit myClass(QObject *parent = 0);

QString answer() const;
void setAnswer(const QString &str);

private:
QString m_answer;
};

#endif // MYCLASS_H


plugInterface.h

#ifndef PLUGINTERFACE_H
#define PLUGINTERFACE_H

#include
#include "myClass.h"

class plugInterface
{
public:
virtual ~plugInterface() {}
virtual QString echo(myClass *value) = 0;
};

#define PlugInterface_iid "example.suite.app.PluginInterface"

Q_DECLARE_INTERFACE(plugInterface, PlugInterface_iid)

#endif // PLUGINTERFACE_H


MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

if (!loadPlugin())
{
QMessageBox::information(this, "Error", "Could not load the plugin");
}

m_class = new myClass(this);
m_class->setAnswer("Good!");
}

MainWindow::~MainWindow()
{
delete ui;
}

bool MainWindow::loadPlugin()
{
QDir pluginsDir(qApp->applicationDirPath());

if (pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release")
pluginsDir.cd("plugins");

foreach (QString fileName, pluginsDir.entryList(QDir::Files))
{
QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
QObject *plugin = pluginLoader.instance();
if (plugin) {
m_interface = qobject_cast
(plugin);
if (m_interface)
return true;
}
}

return false;
}

void MainWindow::on_button_clicked()
{
ui->lineResult->setText(m_interface->echo(m_class));
}


myClass.cpp

#include "myClass.h"

myClass::myClass(QObject *parent) : QObject(parent)
{

}

QString myClass::answer() const
{
return m_answer;
}

void myClass::setAnswer(const QString &str)
{
m_answer = str;
}


plugin.pro

TEMPLATE = lib
CONFIG += plugin
QT += widgets
INCLUDEPATH += ../host
HEADERS = myPlugin.h
SOURCES = myPlugin.cpp
TARGET = $$qtLibraryTarget(myPlugin)
DESTDIR = ../plugins


myPlugin.h

#ifndef MYPLUGIN_H
#define MYPLUGIN_H

#include
#include "plugInterface.h"

class myPlugin : public QObject, plugInterface
{
Q_OBJECT
Q_PLUGIN_METADATA(IID "example.suite.app.PluginInterface")
Q_INTERFACES(plugInterface)

public:
QString echo(myClass *value) Q_DECL_OVERRIDE;
};

#endif // MYPLUGIN_H


myPlugin.cpp

#include "myPlugin.h"

QString myPlugin::echo(myClass *value)
{
return value->answer();
}


Подробнее здесь: https://stackoverflow.com/questions/391 ... -qt-plugin
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»