anwser이다 .. 예. 몇 달 후 다시이 일을 할 수있었습니다.
그래서 Qt 소스 코드에서 우리는 무엇이 QQmlExtensionPlugin
인지 알 수 있습니다. 그것은 정말로 Qt 플러그인입니다 (우리는 QPluginLoader
을 통해 열 수 있습니다) - QPlugin
. 내 생각에 그것은 Qt's plugin type list에 나열되어야합니다.
응용 프로그램에서 qml 플러그인을 열려면 응용 프로그램에서 qobject_cast
으로 캐스팅 할 인터페이스를 구현해야합니다. 내 프로젝트에 보이는 같은 :
#ifndef MYPLUGIN_H
#define MYPLUGIN_H
#include <QQmlExtensionPlugin>
class ExternalInterface
{
public:
virtual const QString pluginVersion() const = 0;
virtual const QString qxmppVersion() const = 0;
virtual ~ExternalInterface() {}
};
Q_DECLARE_INTERFACE(ExternalInterface, "com.my.ExternalInterface")
class MyPlugin : public QQmlExtensionPlugin, public ExternalInterface
{
Q_OBJECT
Q_INTERFACES(ExternalInterface)
Q_PLUGIN_METADATA(IID "com.MyPlugin")
public:
void registerTypes(const char *uri);
void initializeEngine(QQmlEngine *engine, const char *uri);
const QString pluginVersion() const final override;
const QString qxmppVersion() const final override;
};
#endif // MYPLUGIN_H
다음, 플러그인을 열 응용 프로그램의 MAIN.CPP에
:
ExternalInterface* pluginVersion = nullptr;
#ifdef Q_OS_MACOS
const QString fileSuffix = ".dylib";
#else
const QString fileSuffix = ".so";
#endif
QPluginLoader qmlPlugin(QApplication::applicationDirPath() + "../PlugIns/quick/libmyplugin" + fileSuffix);
qmlPlugin.load();
if (qmlPlugin.isLoaded()) {
pluginVersion = qobject_cast<ExternalInterface*>(qmlPlugin.instance());
} else {
qmlPlugin.setFileName(QLibraryInfo::location(QLibraryInfo::Qml2ImportsPath) + "/fx/my/libmyplugin" + fileSuffix);
qmlPlugin.unload();
qmlPlugin.load();
if (qmlPlugin.isLoaded()) {
pluginVersion = qobject_cast<ExternalInterface*>(qmlPlugin.instance());
} else {
qDebug() << "ERROR while opening plugin: " << qmlPlugin.errorString();
}
}
if (pluginVersion) {
qDebug() << "Plugin: \n" << pluginVersion->pluginVersion() << "\n"
<< pluginVersion->qxmppVersion() << "\n"
<< "Location: " << qmlPlugin.fileName();
} else {
qDebug() << "Can't obtain version information from the plugin";
}
여기에 최악의 일은 당신이 플러그인에 전체 경로를 제공해야한다는 것입니다 (공유 라이브러리) 다른 시스템에 설치되는 위치를 알아야합니다.
물론 할 수 있습니다. 당신의 예제에서 C++로부터 읽지 않았습니까? – folibis
@folibis hm, 어디? –
myPlugin-> version() – folibis