在运行时将 QML 对话框嵌入 QDialog window

Embed QML Dialog inside QDialog window at runtime

我以前从未使用过 QML,我不知道以下是否可行。

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

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

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

所以每个插件都可以 return 一组关于它希望配置对话框看起来像什么的 QML 数据。

当用户配置此插件时,此应用程序显示空 QDialog 并询问插件 "give me your qml config data";然后在空 QDialog.

中渲染和执行

根据字符串缓冲区或 QML 数据文件路径的 QML 数据能否在运行时解释并呈现为空 QDialog

底线:

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

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

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

Qt Quick 非常灵活,因为您不必被迫将插件中的 Qt Quick 项目分开 windows。您可以将它们设置为移动设备的轻弹前端、桌面应用程序的可停靠前端等。插件中的可视项目可以任何您希望的方式实例化——多次、在其他项目内部等。

因此,最好让插件向引擎注册它们的视觉项目类型,并让您的应用程序通过 Loader 决定如何使用这些类型,而不是简单地传递给您要处理的原始 QML。