【问题标题】:Embed QML Dialog inside QDialog window at runtime在运行时将 QML Dialog 嵌入到 QDialog 窗口中
【发布时间】:2015-10-23 02:13:27
【问题描述】:

我以前从未使用过 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 配置数据”;然后在空的QDialog 中渲染和执行。

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

底线:

  1. QML 在运行时可以这样处理吗?
  2. 我可以在传统的QDialog 窗口中嵌入 QML Dialog 描述,还是这两种类型不能混合使用?
  3. 这是远程一个好主意还是我应该做很多不同的事情? :)

【问题讨论】:

    标签: qt qml qtquick2 qt5.5


    【解决方案1】:

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

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

    Qt Quick 非常灵活,您不必将插件中的 Qt Quick 项目放在单独的窗口中。您可以将它们设置在移动设备的可滑动前端、桌面应用程序的可停靠前端等中。插件中的可视项目可以按您希望的任何方式实例化 - 多次、在其他项目内部等。

    因此,插件向引擎注册其可视项类型可能是一个更好的主意,并让您的应用程序通过Loader 决定如何使用这些类型,而不是简单地将原始 QML 传递给您来处理与。

    【讨论】:

    • 谢谢!在大多数情况下:我已经让它工作了...... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多