在运行时将 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
?
底线:
- QML在运行时可以这样处理吗?
- 我可以在传统的
QDialog
window 中嵌入 QML Dialog
描述吗?还是这两种类型不能混用?
- 这甚至 是个好主意 还是我应该做很多不同的事情? :)
没有理由使用 QDialog
。您可以这样做,但是 QDialog
是使用光栅绘制引擎渲染的,并且您将使用 CPU 将其与 Qt Quick 渲染到的 OpenGL 帧缓冲区进行合成。这将是一个糟糕的过早悲观。
在您的场景中,插件中的 QML 将传递给 QQuickView
。您还会发现插件需要访问 QML 引擎以设置上下文对象以将 C++ 连接到 QML,并注册它们的对象。您可以使用全局引擎实例,并将其传递给插件。或者,要隔离它们,请使用只为这些插件提供服务的专用引擎。
Qt Quick 非常灵活,因为您不必被迫将插件中的 Qt Quick 项目分开 windows。您可以将它们设置为移动设备的轻弹前端、桌面应用程序的可停靠前端等。插件中的可视项目可以任何您希望的方式实例化——多次、在其他项目内部等。
因此,最好让插件向引擎注册它们的视觉项目类型,并让您的应用程序通过 Loader
决定如何使用这些类型,而不是简单地传递给您要处理的原始 QML。
我以前从未使用过 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
?
底线:
- QML在运行时可以这样处理吗?
- 我可以在传统的
QDialog
window 中嵌入 QMLDialog
描述吗?还是这两种类型不能混用? - 这甚至 是个好主意 还是我应该做很多不同的事情? :)
没有理由使用 QDialog
。您可以这样做,但是 QDialog
是使用光栅绘制引擎渲染的,并且您将使用 CPU 将其与 Qt Quick 渲染到的 OpenGL 帧缓冲区进行合成。这将是一个糟糕的过早悲观。
在您的场景中,插件中的 QML 将传递给 QQuickView
。您还会发现插件需要访问 QML 引擎以设置上下文对象以将 C++ 连接到 QML,并注册它们的对象。您可以使用全局引擎实例,并将其传递给插件。或者,要隔离它们,请使用只为这些插件提供服务的专用引擎。
Qt Quick 非常灵活,因为您不必被迫将插件中的 Qt Quick 项目分开 windows。您可以将它们设置为移动设备的轻弹前端、桌面应用程序的可停靠前端等。插件中的可视项目可以任何您希望的方式实例化——多次、在其他项目内部等。
因此,最好让插件向引擎注册它们的视觉项目类型,并让您的应用程序通过 Loader
决定如何使用这些类型,而不是简单地传递给您要处理的原始 QML。