我有可以动态加载插件的应用程序。每个插件都有其自己的pluginname.qml文件。我需要从pluginname.qml文件访问plugins方法。 显然,由于插件的抽象接口,我无法使用QQmlContext :: setContextPropert(“”,* object)。那么创建这样的功能的正确方法是什么。我如何直接从qml访问插件的方法(将插件方法公开到qml)?不好意思英语:)
playerView.qml:
Component.onCompleted:
{
ViewManager.requestPlugin("playerPlugind.dll"); // ViewManager signal connected to PluginLoader void onPluginRequest() slot
}
PluginLoader.cpp:
bool PluginLoader::loadPlugin(QString plugin_name)
{
QDir pluginDirectory = QCoreApplication::applicationDirPath();
pluginDirectory.cd("Plugins");
QPluginLoader pluginLoader(pluginDirectory.filePath(plugin_name));
QObject* instance = pluginLoader.instance();
if(instance)
{
m_player_interface = qobject_cast<PlayerInterface *>(instance);
if(m_player_interface )
return true;
}
return 0;
}
void PluginLoader::onPluginRequest(QString plugin_name)
{
loadPlugin(plugin_name);
}
答案 0 :(得分:0)
这个答案有点愚蠢,但是我们可以在接口类中创建一个成员函数,如下所示:
virtual void contextRegister(QQmlContext* rootContext) = 0;
然后在插件中实现成员函数:
void FirstPlugin::registerContext(QQmlContext* rootContext)
{
rootContext->setContextProperty("PlayerInterface" , this);
}
最后,当插件完全加载后,我们可以调用此函数:
playerInterface->contextRegister(m_rootContext);