qt - ¿Cuál es la diferencia entre QQmlApplicationEngine y QQuickView?
qtquick2 (2)
Puede usar ambos juntos si no desea que su elemento de nivel superior sea una Window
.
QQmlApplicationEngine engine;
QQuickView view(&engine, 0);
// your usual engine code
view.show();
Estoy usando QQmlApplicationEngine
siguiente manera:
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
app.exec();
Pero ahora quiero habilitar el multimuestreo para mi aplicación, y QQmlApplicationEngine
no parece tener un método setFormat
para habilitar el multimuestreo.
Encontré una forma de hacerlo con un QQmlApplicationEngine
en un foro :
QQuickWindow* window = (QQuickWindow*) engine.rootObjects().first();
QSurfaceFormat format;
format.setSamples(16);
window->setFormat(format)
Pero se basa en que el primer objeto raíz del motor es un QQuickWindow
, que no está documentado en los documentos Qt. Así que no quiero usar esa técnica.
Otra forma sería omitir QQmlApplicationEngine
y crear un QQuickView
en QQuickView
lugar. Esto tiene un método setFormat
que me permite habilitar el multisampling, pero me pregunto, ¿estoy perdiendo algo al cambiar de QQmlApplicationEngine
a QQuickView
?
En otras palabras, ¿cuáles son las diferencias entre estas dos clases?
Una diferencia que encontré es esto (desde here ):
A diferencia de QQuickView, QQmlApplicationEngine no crea automáticamente una ventana raíz. Si está utilizando elementos visuales de Qt Quick, deberá colocarlos dentro de una ventana.
Esta diferencia particular no me importa.
¿Alguna otra diferencia?
Titular: QQmlApplicationEngine es más nuevo y más poderoso que QQuickView.
QQmlApplicationEngine expone algunas funciones centrales de la aplicación a QML, que la aplicación QQuickView normalmente controlaría desde C ++:
- Conectando Qt.quit () a QCoreApplication :: quit ()
- Carga automáticamente los archivos de traducción desde un directorio i18n adyacente al archivo QML principal.
- Establece automáticamente un controlador de incubación si la escena contiene un QQuickWindow.
- Establece automáticamente un QQmlFileSelector como el interceptor de URL, aplicando selectores de archivos a todos los archivos y activos QML.
Ref: Qt docs
En el momento en que se introdujo QQmlApplicationEngine, el Blog de Qt tenía esto para decir :
En Qt 5.0, generalmente creamos aplicaciones Qt Quick declarando un QQuickView en C ++ y estableciendo la base url en él. El inconveniente de este enfoque es que tiene que usar C ++ para establecer propiedades como el ancho, el alto, etc. En Qt 5.1, recomendamos utilizar Windows o ApplicationWindow como el elemento raíz de su aplicación, dando control completo a Qt Quick, por lo que ahora estamos presentando el QQmlApplicationEngine para simplificar un poco este caso de uso. El QmlApplicationEngine es todo lo que necesita para configurar su ventana rápida qt, recoger los archivos de traducción correctos y conecta de manera implícita la señal quit () de la aplicación a su ventana raíz.
Qt Quick Controls 2.0 puede hacer uso de este control de aplicación adicional, a través del nuevo elemento ApplicationWindow , que:
- es similar a la QQuickWindow normal, pero agrega soporte para configurar una Barra de menús, Barra de herramientas y Barra de estado específicas de la ventana en QML.
- hace que sea conveniente agregar un elemento de encabezado y pie de página a la ventana.
- permite controlar las propiedades, el aspecto y el diseño de la ventana desde QML.
- admite ventanas emergentes a través de su propiedad de superposición, lo que garantiza que las ventanas emergentes se muestren por encima de otro contenido y que el fondo se vea atenuado cuando se vea una ventana emergente modal.
Por lo tanto, para poder utilizar algunas de las funciones de controles rápidos de Qt como MenuBar y Popup, necesitamos:
- use ApplicationWindow como nuestro elemento de QML de nivel superior en lugar de Rectángulo o Elemento
- use el nuevo QQmlApplicationEngine para cargar el QML desde C ++ en lugar del antiguo QQuickView.