Mi forma de guerrero, o cómo preparé una aplicación para la vida en Sailfish

El arte de un guerrero es mantener el equilibrio.
entre el horror de ser humano y el milagro de ser humano.
"Viaje a Ixtlán"

Mi camino de guerrero, un desarrollador frontend brutal en los profesionales, fue encontrar un equilibrio entre el desarrollo de una aplicación que se ejecuta en Sailfish y una aplicación multiplataforma.

Recientemente, he estado trabajando en el puesto de desarrollador en Digital Design, y a veces tengo que lidiar con tareas que no había encontrado antes. Es interesante y a menudo divertido. Ahora, por ejemplo, estoy escribiendo una aplicación corporativa para Sailfish OS y quiero compartir mi experiencia con usted; esto se discutirá a continuación. Sígueme debajo del corte si eres un desarrollador novato o, al igual que yo, te enfrentas a la tarea de adaptar una aplicación corporativa para el sistema operativo Sailfish y no sabes por dónde empezar, así como aquellos que no han escuchado sobre las características de Qt y Sailfish.


Un poco de historia, o por qué lo hice.


Cuando la compañía desarrolló la solución Areopad ISCO para iPad (iOS) hace 5 años, nadie podría haber pensado que los clientes necesitarían una aplicación para trabajar en un dispositivo con sistema operativo Sailfish (entonces el sistema operativo pertenecía a la empresa finlandesa Jolla, sin embargo, ahora también). Pero en 2016, la compañía rusa Open Mobile Platform adquirió una licencia para su uso, modificación, distribución y lo recordó: adaptó los dispositivos móviles y usuarios domésticos (principalmente empresas y agencias gubernamentales) y registró Sailfish Mobile OS RUS en el registro . Y ahora, uno podría decir, es el único sistema operativo oficial ruso para dispositivos móviles.

Naturalmente, queríamos entenderlo: ya conquistamos el resto del sistema operativo y, aparentemente, Sailfish tiene un gran futuro (sí, estoy hablando de la sustitución de importaciones). De todo esto se deduce que la aplicación para Sailfish sea! La primera aplicación que se probó fue el Sistema de información de aplicaciones móviles para el trabajo de los cuerpos colegiales Areopad (estaba en la etapa de modernización).

Ahora sobre qt


Una maravillosa herramienta multiplataforma que incluye un entorno de desarrollo, un montón de bibliotecas útiles y convenientes, e incluso su propio lenguaje de marcado QML. No me detendré en ello durante mucho tiempo, porque se han escrito muchos artículos sobre este milagro en el Habré, y también puede leer la documentación , que se lee de forma fácil y natural.

Por si acaso, aclararé que los cálculos y el mapeo se realizan en diferentes idiomas en diferentes módulos (C ++ y QML) que interactúan entre sí utilizando métodos especiales difíciles (propiedad, ranura de señal).

Y Qt es el marco principal utilizado en el desarrollo de software para Sailfish.

Enfoques para resolver el problema: vaya a la izquierda - ganará una muleta, vaya a la derecha - perderá características


Al principio, inspirado por la idea de multiplataforma y el hecho de que lo implementaré, pensé que una aplicación escrita para Sailfish no despegaría, pero sería un fracaso feliz en cualquier otro sistema operativo, incluso un refrigerador o un hervidor de agua. Pero mi felicidad duró exactamente hasta el momento en que me senté para ejecutarlo en Android, luego me sentí triste. Sailfish no está en absoluto adaptado para este negocio y definitivamente no tiene la intención de cambiar nada.

Si Android o iOS le permiten usar la compilación condicional y proporcionar algún tipo de kit de herramientas para esto, entonces Sailfish no se puede distinguir de Linux (dentro de Qt, por supuesto).

Luego, surge el problema de compatibilidad QML: en Sailfish, la versión obsoleta de Qt Quick (2.6 para Sailfish y ya 2.11 para todos los demás), Android no conoce Silica, Sailfish no conoce QtQuick.Controls. Por lo tanto, para diferentes sistemas operativos, debe extraer los mismos componentes de diferentes bibliotecas, lo que produce casi los mismos archivos para cada sistema operativo.
Al mismo tiempo, Silica probablemente tiene las mismas características que QtQuick.Controls, pero se niega a ejecutarse en cualquier otra plataforma.

Características del pez vela


Siendo una persona perezosa, lo más creativa posible con el deseo de optimizar los costos laborales, tomé el camino de menor resistencia funcional y escribí mi obra maestra en Qt puro, sin usar QtQuick.Controls y Silica. Como resultado, todo funciona de manera decente y noble en Sailfish, pero en Android, la mitad de los elementos, a pesar de mi estricta orden de permanecer quieto, han ido a algún lugar por sus asuntos probablemente importantes, por lo que el siguiente paso aún se hará en un adulto y divorciado. archivos de marcado para cada sistema operativo en diferentes ángulos. [Lo que hice más tarde, mientras preparaba un artículo para su publicación. Esta historia se basa en un artículo separado]. Recuerde y acepte: las constantes mágicas son malas (por ejemplo, ancho: 15). Y en dos dispositivos casi idénticos, incluso con el mismo sistema operativo, pueden diferir en 2 veces.

Sin embargo, no puedo dejar de notar que definitivamente hay cosas interesantes en la versión Sailfish. Por supuesto, durante un período tan corto que estoy familiarizado con él, es casi imposible conocer todo el rico mundo interior de Sailfish: nuestra relación con él está en la etapa del "período del ramo de dulces", y mucho de lo que aún no he estudiado en su carácter complejo. Además, se decidió dibujar una aplicación universal para todos los sistemas operativos, por lo que no tuve la oportunidad de usar mecanismos más sofisticados para usar la oportunidad, pero probablemente le cuente algunos puntos interesantes.

Solo hablaremos de una biblioteca para implementar la GUI de Silica, porque el resto que logré aprender y comprender no es diferente de la programación estándar de QML.

  • Tema.

Esta herramienta me interesó más porque no he visto un análogo en otros sistemas operativos, y también es sencillo. La conclusión es que el diseño de la aplicación no es una constante, sino que depende del tema elegido.

El elemento del tema contiene información sobre el tema seleccionado actualmente: colores primarios, tamaños de fuente, sangrías y componentes. Por lo tanto, al escribir aplicaciones, no necesita codificar los colores, ajustar el tamaño para que se ajuste a la pantalla y, en general, mirar el diseño (perdone a los diseñadores, ya tiene mucho trabajo), simplemente puede extraerlo todo del elemento Theme. Bueno, ¿no es genial?



  • Menu

También es una característica de Sailfish (aunque puede ser posible en Android, pero no lo he visto).

Hay tres tipos de menús:
PullDownMenu - PushUpMenu - ContextMenu



En cuanto a Silica ... Ver: no son diferentes del estándar ... Ver (son ± un par de propiedades no muy notables), y el componente Botón lo pone bastante nervioso: la altura del botón no se puede cambiar, debe escribir Rectángulo y MouseArea en todas partes. Si estuviera haciendo una aplicación solo para Sailfish, usando el diseño estándar de este sistema operativo, no sería necesario cambiar la altura del botón o sería posible usar un componente de Silica . Pero como estoy escribiendo una aplicación para todos los dispositivos, se decidió utilizar el diseño más masivo (Android), para que todos estén familiarizados y cómodos. Muchos no están de acuerdo conmigo y dicen que necesita usar elementos de interfaz de usuario nativos para cada plataforma, pero este es un tema completamente diferente, ha sido objeto de holivars durante muchos años, durante este tiempo ha crecido más de una generación de desarrolladores.

Vuela en la pomada para el desarrollo móvil en Qt


  • Asicronismo

En Qt, para comunicarse con el servidor, llamar a una función no es suficiente, debe enviar una solicitud y solicitar un objeto especial responsable de la respuesta del servidor, llamar a la función de procesamiento de respuesta (que, por supuesto, nosotros mismos escribimos), cuando se recibe la respuesta:

void foo() { QNetworkRequest request("http://www.leningrad.spb.ru"); QNetworkReply *reply = mngr->get(request); connect(reply, &QNetworkReply::finished, this, &Class:: onReplyFinished); } void onReplyFinished () { QNetworkReply *reply = (QNetworkReply*)sender(); QByteArray ans = reply->readAll(); qDebug() << ans; } 

Se llamará a la función onReplyFinished cuando se reciba una respuesta del servidor, y esto puede tardar sin importar cuánto tiempo depende de la calidad de la conexión y del lado del servidor. Ahora imagine cómo se organizará todo esto con 1500-2000 solicitudes, que en este caso dependen unas de otras y deben ejecutarse en estricto orden. Y si recuerda que toda la parte de la interfaz de usuario depende de la respuesta, se vuelve completamente aterradora.

  • Programación orientada a muletas, o un enfoque creativo para resolver problemas

Otro tema es ListView, que es un problema Qt muy local, pero aún desagradable.

Cualquier ListView que se respete debe tener un componente de encabezado que, como primer delegado, inserte algún elemento que sea fundamentalmente diferente del resto. Sí, lo hace, sí, pinta todo perfectamente, si no fuera por un "pero": mi delegado ocupa toda la pantalla, y necesita desplazarse, pero tan pronto como trato de desplazarme hacia la izquierda al encabezado desde el índice cero, básicamente rechaza esto Mostrar encabezado. ¿Qué hacer al respecto? Cosas con una muleta. Una parte de mi código de formación de modelo para este ListView en la parte cpp, que describe lo que está sucediendo con la mayor precisión posible:

 foreach (QVariant quest, QQuestions) { Questions.append(new Question(client, quest)); } kostilQuestions = Questions; if (Questions.size() > 0) kostilQuestions.prepend(Questions[0]); 

A continuación, se crean 2 elementos independientes en el delegado, cuya visibilidad depende del índice.
Cuando el índice es cero, vemos uno, de lo contrario el otro.

Resumen


Como resultado, obtuve una aplicación que "vuela" en Android e iOS, y Sailfish, más precisamente una aplicación flexible que se adapta a estos sistemas operativos. Y la magia no tiene nada que ver con eso. Encontré una manera de evitar conflictos y hacer amigos de todos los sistemas operativos con Sailfish sustituyendo algunos archivos por Sailfish y todos los demás. Esto nos permitió seleccionar capas de interfaz de usuario para cada sistema operativo en el código de la aplicación.

Podemos suponer que dimos el primer paso: nos hicimos amigos de Sailfish. Pero el trabajo sobre esto no se ha completado, Sailfish y yo vamos a un nuevo nivel de nuestra relación: estamos preparando la aplicación Areopad CSIS para el registro en el registro (como la aplicación Sailfish), lo que significa que tendremos que adaptarla también para el registro.

Espero que haya sido interesante. Continuará

Source: https://habr.com/ru/post/es420491/


All Articles