在运行时在QDialog窗口中嵌入QML对话框

时间:2015-07-31 11:50:16

标签: qt qml qtquick2 qt5.5

我之前从未使用过QML,而且我也不知道以下是否可以使用QML。

我目前正在使用现有代码和大量UI文件将C ++ Qt应用程序移植到Qt 5.5。此应用程序稍后在运行时加载大量C ++插件dll。现在每个插件都应该有自己的配置对话框;虽然这些插件当前都没有Qt依赖。

我目前正在考虑使用以下内容扩展界面:

class CPlugin {
    public:
        virtual std::string const& getQmlDescription() const;
        virtual std::string const& getQmlFilePath() const;
};

因此,每个插件都可以返回一组关于它希望配置对话框看起来如何的QML数据。

当这个插件应该由用户配置时,该应用程序显示一个空的QDialog并询问插件"给我你的qml配置数据&#34 ;;然后在空QDialog内呈现并执行。

根据字符串缓冲区或QML数据的文件路径,这个QML数据是否可以在运行时被解释并呈现为空QDialog

底线:

  1. QML可以在运行时像这样处理吗?
  2. 我可以在传统的Dialog窗口中嵌入QML QDialog说明,还是这两种类型不混合?
  3. 这甚至是远程一个好主意还是我应该采取不同的方式? :)

1 个答案:

答案 0 :(得分:2)

没有理由使用QDialog。您可以这样做,但使用光栅绘制引擎渲染QDialog,并且您正在使用CPU将其与Qt Quick渲染的OpenGL帧缓冲区进行合成。这是一个糟糕的过早悲观。

在您的方案中,插件中的QML将传递给QQuickView。您还会发现插件需要访问QML引擎来设置上下文对象以将C ++接口到QML,并注册它们的对象。您可以使用全局引擎实例,并将其传递给插件。或者,要隔离它们,请使用仅为这些插件提供服务的专用引擎。

Qt Quick非常灵活,因为您不必在单独的窗口中使用插件中的Qt Quick项目。您可以在移动设备的可移动前端,桌面应用程序的可停靠前端等中设置它们。插件中的可视项目可以按照您希望的方式实例化 - 多次,在其他项目内等。< / p>

因此,插件可以更好地使用引擎注册其可视化项类型,让您的应用程序通过Loader决定如何使用这些类型,而不是简单地传递原始QML处理。