Qt 运行时在QDialog窗口中嵌入QML对话框

Qt 运行时在QDialog窗口中嵌入QML对话框,qt,qml,qtquick2,qt5.5,Qt,Qml,Qtquick2,Qt5.5,我以前从未使用过QML,我甚至不知道下面的方法是否可行 我目前正在用现有代码和大量UI文件向Qt 5.5移植C++ QT应用程序。这个应用程序在运行时加载大量的C++插件DLL。现在每个插件都应该有自己的配置对话框;尽管这些插件目前都没有Qt依赖性 我目前正在考虑通过以下方式扩展接口: class CPlugin { public: virtual std::string const& getQmlDescription() const; virt

我以前从未使用过QML,我甚至不知道下面的方法是否可行

我目前正在用现有代码和大量UI文件向Qt 5.5移植C++ QT应用程序。这个应用程序在运行时加载大量的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
    窗口中嵌入QML
    对话框
    描述吗?还是这两种类型不能混合使用
  • 这是一个好主意还是我应该做得非常不同
    没有理由使用
    QDialog
    。您可以这样做,但是使用光栅绘制引擎渲染
    QDialog
    ,您可以使用CPU将其与Qt Quick渲染到的OpenGL帧缓冲区合成。这将是一种严重的过早悲观

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

    Qt Quick非常灵活,因为您不必在单独的窗口中强制使用插件中的Qt Quick项目。您可以在移动设备的flickable前端中设置它们,桌面应用程序的可固定前端中设置它们,等等。插件中的可视项可以按照您希望的任何方式实例化-多次,在其他项中实例化,等等


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

    谢谢!大部分情况下:我已经让它工作了……:)