我以前从未使用过 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
吗?
底线:
- QML 可以在运行时这样处理吗?
- 我可以在传统的
QDialog
窗口中嵌入 QMLDialog
描述吗?还是这两种类型不能混合? - 这是否是一个好主意还是我应该采取不同的做法? :)
最佳答案
没有理由使用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/