QQmlApplicationEngine和QQuickView有什么区别?

Ste*_*nov 23 qt qml qtquick2 qquickview qqmlapplicationengine

我使用QQmlApplicationEngine如下:

QGuiApplication app(argc, argv);

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

app.exec();
Run Code Online (Sandbox Code Playgroud)

但现在我想为我的应用程序启用多重采样,并且QQmlApplicationEngine似乎没有setFormat启用多重采样的方法.

QQmlApplicationEngine 在论坛中找到了一种方法:

QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
Run Code Online (Sandbox Code Playgroud)

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

另一种方法是跳过QQmlApplicationEngine并创建一个QQuickView代替.这确实有一个setFormat让我能多采样方法,但我不知道,我是不可能输给由切换什么QQmlApplicationEngineQQuickView

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

我找到的一个区别是(从这里):

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

这种特殊的差异对我来说无关紧要.

还有其他差异吗?

Mar*_* Ch 22

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

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

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

参考:Qt docs

在引入QQmlApplicationEngine时,Qt博客有这样说:

在Qt 5.0中,我们通常通过在C++中声明一个QQuickView并在其上设置基本URL来创建Qt Quick应用程序.这种方法的缺点是你必须使用C++来设置宽度,高度等属性.在Qt 5.1中,我们鼓励使用Window或ApplicationWindow作为应用程序的根项,完全控制Qt Quick,所以我们现在介绍QQmlApplicationEngine使这个用例更简单一些.QmlApplicationEngine是您设置qt快速窗口,选择正确的翻译文件以及隐式将应用程序quit()信号连接到根窗口所需的全部内容.

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

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

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

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


Kev*_*mer 5

如果您不希望顶级项目成为a,则可以同时使用它们Window.

QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();
Run Code Online (Sandbox Code Playgroud)