QQmlApplicationEngine和QQuickView有什么区别?

时间:2016-10-20 11:37:19

标签: qt qml qtquick2 qquickview qqmlapplicationengine

我正在使用QQmlApplicationEngine,如下所示:

QGuiApplication app(argc, argv);

QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

app.exec();

但现在我想为我的应用启用多重采样,而QQmlApplicationEngine似乎没有setFormat方法来启用多重采样。

我找到了一种使用QQmlApplicationEngine in a forum

的方法
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)

但它依赖于引擎的第一个根对象是QQuickWindow,这在Qt文档中没有记录。所以我不想使用那种技术。

另一种方法是跳过QQmlApplicationEngine并创建QQuickView。这有一个setFormat方法让我启用多重采样,但我想知道,我是否因为从QQmlApplicationEngine切换到QQuickView而丢失了任何内容?

换句话说,这两个类之间有什么区别?

我发现的一个区别是(来自here):

  

与QQuickView不同,QQmlApplicationEngine不会自动创建根窗口。如果您使用Qt Quick中的可视项目,则需要将它们放在窗口中。

这种特殊的差别对我来说无关紧要。

还有其他差异吗?

2 个答案:

答案 0 :(得分:19)

标题:QQmlApplicationEngine比QQuickView更新,更强大。

QQmlApplicationEngine向QML公开了一些中央应用程序功能,QQuickView应用程序通常会从C ++控制它:

  
      
  • 将Qt.quit()连接到QCoreApplication :: quit()
  •   
  • 自动加载与主QML文件相邻的i18n目录中的翻译文件。
  •   
  • 如果场景包含QQuickWindow,则自动设置孵化控制器。
  •   
  • 自动将QQmlFileSelector设置为url拦截器,将文件选择器应用于所有QML文件和资产。
  •   

参考:Qt docs

在引入QQmlApplicationEngine时,Qt Blog had this to say

  

在Qt 5.0中,我们通常通过声明a来创建Qt Quick应用程序   用C ++编写的QQuickView并在其上设置基本URL。缺点是   方法是你必须使用C ++来设置像width这样的属性,   在Qt 5.1中,我们鼓励使用Window或ApplicationWindow   作为您的应用程序的根项,完全控制Qt   快点,所以我们现在介绍QQmlApplicationEngine来制作   这个用例有点简单。 QmlApplicationEngine就是全部   你需要设置你的qt快速窗口,选择正确的翻译   文件和它隐式地将应用程序quit()信号连接到您的   根窗口。

Qt Quick Controls 2.0能够通过新项目ApplicationWindow利用这个额外的应用程序控制,其中:{/ p>

  • 类似于常规QQuickWindow,但增加了对在QML中设置窗口特定MenuBar,ToolBar和StatusBar的支持。
  • 可以方便地向页面添加页眉和页脚项目。
  • 可以从QML控制窗口的属性,外观和布局。
  • 通过其overlay属性支持弹出窗口,这可确保弹出窗口显示在其他内容之上,并且当模式弹出窗口可见时背景变暗。

因此,为了使用一些Qt Quick Controls功能,如MenuBar和Popup,我们需要:

  • 使用ApplicationWindow作为我们的顶级QML项而不是Rectangle或Item
  • 使用新的QQmlApplicationEngine从C ++而不是旧的QQuickView加载QML。

答案 1 :(得分:6)

如果您不希望自己的顶级项目为Window,则可以同时使用它们。

QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();