qt - 在运行时将 QML Dialog 嵌入到 QDialog 窗口中

标签 qt qml qtquick2 qt5.5

我以前从未使用过 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. 这是否是一个好主意还是我应该采取不同的做法? :)

最佳答案

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

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

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

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

关于qt - 在运行时将 QML Dialog 嵌入到 QDialog 窗口中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31745490/

相关文章:

qml - 如何在 QML swipeview 中实现翻页按钮

qt - 如何在运行时以编程方式更改主窗口的几何形状 w.r.t QML?

qt - loader.source 更改时 Qml 加载器的动画

qt - 自定义样式 Qt 快速控件

c++ - 在 Qt 中获取耗时

qt - Qt拖放中的热点是什么意思?

javascript - 在 MouseClick 运行时动态更改 QML 主题

qt - 如何翻译默认 qsTr 字段 - 例如MessageDialog 是/否按钮

qt - QPainter JNI调用使应用程序崩溃

qt - Runner::call: 上下文 -1 的套接字为空