2

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

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

底线:

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

1 回答 1

2

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

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

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

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

于 2015-07-31T12:07:47.013 回答