QQmlApplicationEngine 和 QQuickView 有什么区别?
What is the difference between QQmlApplicationEngine and QQuickView?
我使用 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):
Unlike QQuickView, QQmlApplicationEngine does not automatically create a root window. If you are using visual items from Qt Quick, you will need to place them inside of a Window.
这种特殊的区别对我来说无关紧要。
还有其他区别吗?
如果您不希望您的顶级项目成为 Window
,您可以同时使用两者。
QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();
标题:QQmlApplicationEngine 比 QQuickView 更新更强大。
QQmlApplicationEngine 向 QML 公开一些中央应用程序功能,QQuickView 应用程序通常会从 C++ 控制这些功能:
- Connecting Qt.quit() to QCoreApplication::quit()
- Automatically loads translation files from an i18n directory adjacent to the main QML file.
- Automatically sets an incubation controller if the scene contains a QQuickWindow.
- Automatically sets a QQmlFileSelector as the url interceptor, applying file selectors to all QML files and assets.
参考:Qt docs
引入QQmlApplicationEngine时,Qt Blog had this to say:
In Qt 5.0 we generally created Qt Quick applications by declaring a
QQuickView in C++ and setting the base url on it. The drawback of that
approach is that you have to use C++ to set properties like width,
height etc. In Qt 5.1 we encourage using Window or ApplicationWindow
as the root item of your application, giving complete control to Qt
Quick, so we are now introducing the QQmlApplicationEngine to make
this use case a little bit simpler. The QmlApplicationEngine is all
you need to set up your qt quick window, pick up the right translation
files and it implicitly connects the application quit() signal to your
root window.
Qt Quick Controls 2.0 能够通过新项目 ApplicationWindow 使用这个额外的应用程序控件,其中:
- 类似于常规 QQuickWindow,但增加了对在 QML 中设置 window 特定菜单栏、工具栏和状态栏的支持。
- 可以方便地向 window 添加 header 和页脚项目。
- 可以从 QML 控制 window 的属性、外观和布局。
- 通过其叠加层支持弹出窗口 属性,这确保弹出窗口显示在其他内容之上,并且当模式弹出窗口可见时背景变暗。
因此,为了使用一些 Qt Quick Controls 功能,例如 MenuBar 和 Popup,我们需要:
- 使用 ApplicationWindow 作为我们的 top-level QML 项目而不是矩形或项目
- 使用新的 QQmlApplicationEngine 从 C++ 加载 QML 而不是旧的 QQuickView。
我使用 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):
Unlike QQuickView, QQmlApplicationEngine does not automatically create a root window. If you are using visual items from Qt Quick, you will need to place them inside of a Window.
这种特殊的区别对我来说无关紧要。
还有其他区别吗?
如果您不希望您的顶级项目成为 Window
,您可以同时使用两者。
QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();
标题:QQmlApplicationEngine 比 QQuickView 更新更强大。
QQmlApplicationEngine 向 QML 公开一些中央应用程序功能,QQuickView 应用程序通常会从 C++ 控制这些功能:
- Connecting Qt.quit() to QCoreApplication::quit()
- Automatically loads translation files from an i18n directory adjacent to the main QML file.
- Automatically sets an incubation controller if the scene contains a QQuickWindow.
- Automatically sets a QQmlFileSelector as the url interceptor, applying file selectors to all QML files and assets.
参考:Qt docs
引入QQmlApplicationEngine时,Qt Blog had this to say:
In Qt 5.0 we generally created Qt Quick applications by declaring a QQuickView in C++ and setting the base url on it. The drawback of that approach is that you have to use C++ to set properties like width, height etc. In Qt 5.1 we encourage using Window or ApplicationWindow as the root item of your application, giving complete control to Qt Quick, so we are now introducing the QQmlApplicationEngine to make this use case a little bit simpler. The QmlApplicationEngine is all you need to set up your qt quick window, pick up the right translation files and it implicitly connects the application quit() signal to your root window.
Qt Quick Controls 2.0 能够通过新项目 ApplicationWindow 使用这个额外的应用程序控件,其中:
- 类似于常规 QQuickWindow,但增加了对在 QML 中设置 window 特定菜单栏、工具栏和状态栏的支持。
- 可以方便地向 window 添加 header 和页脚项目。
- 可以从 QML 控制 window 的属性、外观和布局。
- 通过其叠加层支持弹出窗口 属性,这确保弹出窗口显示在其他内容之上,并且当模式弹出窗口可见时背景变暗。
因此,为了使用一些 Qt Quick Controls 功能,例如 MenuBar 和 Popup,我们需要:
- 使用 ApplicationWindow 作为我们的 top-level QML 项目而不是矩形或项目
- 使用新的 QQmlApplicationEngine 从 C++ 加载 QML 而不是旧的 QQuickView。