如何将c ++插件属性公开给qml上下文?

时间:2019-01-22 06:29:59

标签: c++ qt qml

我有可以动态加载插件的应用程序。每个插件都有其自己的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);
}

1 个答案:

答案 0 :(得分:0)

这个答案有点愚蠢,但是我们可以在接口类中创建一个成员函数,如下所示:

virtual void contextRegister(QQmlContext* rootContext) = 0;

然后在插件中实现成员函数:

void FirstPlugin::registerContext(QQmlContext* rootContext)
{
    rootContext->setContextProperty("PlayerInterface" , this);
}

最后,当插件完全加载后,我们可以调用此函数:

playerInterface->contextRegister(m_rootContext);