Meu jeito de guerreiro, ou como eu preparei uma aplicação para a vida em Sailfish

A arte de um guerreiro é manter o equilíbrio
entre o horror de ser humano e o milagre de ser humano.
"Viagem a Ixtlan"

Meu caminho de guerreiro - um desenvolvedor brutal de front-end para os profissionais - era encontrar um equilíbrio entre o desenvolvimento de um aplicativo que roda no Sailfish e um aplicativo de plataforma cruzada.

Recentemente, tenho trabalhado na posição de desenvolvedor da Digital Design e, às vezes, tenho que lidar com tarefas que não encontrei antes. É interessante e muitas vezes divertido. Agora, por exemplo, estou escrevendo um aplicativo corporativo para o Sailfish OS e quero compartilhar minha experiência com você - isso será discutido abaixo. Siga-me sob o corte, se você é um desenvolvedor iniciante ou, assim como eu, enfrentou a tarefa de adaptar um aplicativo corporativo para o OS Sailfish e não sabe por onde começar, assim como aqueles que não ouviram falar dos recursos do Qt e do Sailfish.


Um pouco de fundo, ou por que eu fiz isso


Quando a empresa desenvolveu a solução Areopad ISCO para iPad (iOS) há 5 anos, ninguém poderia pensar que os clientes precisariam de um aplicativo para trabalhar em um dispositivo com o sistema operacional Sailfish (então o sistema operacional pertencia à empresa finlandesa Jolla, agora também). Mas em 2016, a empresa russa Open Mobile Platform adquiriu uma licença para seu uso, modificação, distribuição e o lembrou: adaptou dispositivos e usuários móveis domésticos (principalmente empresas e órgãos governamentais) e registrou o Sailfish Mobile OS RUS no registro . E agora, pode-se dizer, este é o único sistema operacional russo oficial para dispositivos móveis.

Naturalmente, queríamos entender - já conquistamos o resto do sistema operacional e o Sailfish, aparentemente, tem um grande futuro (sim, estou falando sobre substituição de importações). De tudo isso segue-se que o pedido de Sailfish para ser! A primeira aplicação a ser testada foi o Sistema de Informações da aplicação móvel para o trabalho dos órgãos colegiados da Areopad (estava apenas na fase de modernização).

Agora sobre qt


Uma maravilhosa ferramenta de plataforma cruzada que inclui um ambiente de desenvolvimento, várias bibliotecas úteis e convenientes e até sua própria linguagem de marcação QML. Não vou insistir nisso por muito tempo, porque muitos artigos foram escritos sobre esse milagre no Habré, e você também pode ler a documentação , que é lida fácil e naturalmente.

Só para esclarecer, vou esclarecer que os cálculos e o mapeamento ocorrem em diferentes idiomas em diferentes módulos (C ++ e QML) que interagem entre si usando métodos complicados especiais (propriedade, slot de sinal).

E o Qt é a principal estrutura usada no desenvolvimento de software para o Sailfish.

Abordagens para resolver o problema: vá para a esquerda - você ganhará uma muleta, vá para a direita - perderá recursos


No início, inspirado na idéia de plataforma cruzada e no fato de implementá-la, pensei que um aplicativo escrito para o Sailfish não decolaria, mas seria feliz em qualquer outro sistema operacional, mesmo em uma geladeira ou chaleira. Mas minha felicidade durou exatamente até o momento em que me sentei para executá-la no Android - então fiquei triste. O Sailfish não é de todo adaptado para este negócio e definitivamente não pretende mudar nada.

Se o Android ou iOS permitir que você use a compilação condicional e forneça algum tipo de kit de ferramentas para isso, o Sailfish não poderá ser distinguido do Linux (no Qt, é claro).

Em seguida, surge o problema de compatibilidade QML: no Sailfish, a versão desatualizada do Qt Quick (2.6 para Sailfish e já 2.11 para todos os outros), o Android não conhece Silica, o Sailfish não conhece QtQuick.Controls. Portanto, para sistemas operacionais diferentes, é necessário extrair os mesmos componentes de bibliotecas diferentes, o que produz quase os mesmos arquivos para cada sistema operacional.
Ao mesmo tempo, o Silica provavelmente possui todos os mesmos recursos do QtQuick.Controls, mas se recusa a executar em qualquer outra plataforma.

Recursos do Sailfish


Sendo uma pessoa criativa preguiçosa e criativa quanto possível, com o desejo de otimizar os custos trabalhistas, segui o caminho da menor resistência funcional e escrevi minha obra-prima em Qt puro, sem usar QtQuick.Controls e Silica. Como resultado, tudo funciona decentemente e nobremente no Sailfish, mas no Android, metade dos elementos, apesar da minha estrita ordem de ficar parado, foi para algum lugar por seus assuntos provavelmente importantes, portanto o próximo passo ainda será feito em um adulto e divorciado arquivos de marcação para cada sistema operacional em ângulos diferentes. [O que fiz depois, enquanto preparava um artigo para publicação. Esta história baseia-se em um artigo separado]. Lembre-se e aceite: constantes mágicas são más (por exemplo, largura: 15). E em dois dispositivos quase idênticos, mesmo com o mesmo sistema operacional, eles podem diferir 2 vezes.

No entanto, não posso deixar de notar que há coisas definitivamente interessantes na versão Sailfish. Claro, por um período tão curto que eu o conheço, é quase impossível conhecer todo o rico mundo interior de Sailfish - nosso relacionamento com ele está no estágio do "período do buquê de doces", e muito do qual ainda não estudei em seu caráter complexo. Além disso, foi decidido desenhar um aplicativo universal para todos os sistemas operacionais, então não tive a chance de usar mecanismos mais sofisticados para usá-la, mas provavelmente vou falar sobre alguns pontos interessantes.

Falaremos apenas de uma biblioteca para implementar a GUI do Silica, porque o restante que eu consegui aprender e entender não é diferente da programação QML padrão.

  • Tema.

Essa ferramenta me interessou mais porque não vi um analógico em outros sistemas operacionais e também é simples. A conclusão é que o design do aplicativo não é uma constante, mas depende do tópico escolhido.

O elemento Tema contém informações sobre o tópico atualmente selecionado: cores primárias, tamanhos de fonte, recuos e componentes. Assim, ao escrever aplicativos, você não precisa codificar as cores, ajustar o tamanho para caber na tela e, geralmente, observar o layout (perdoe os designers, você já tem muito trabalho), basta extrair tudo do elemento Tema. Bem, isso não é legal!



  • Menu

Também é um recurso do Sailfish (embora possa ser possível no Android, mas ainda não o vi).

Existem três tipos de menus:
PullDownMenu - PushUpMenu - ContextMenu



Quanto ao Silica ... View - eles não são diferentes do padrão ... View (são ± algumas propriedades não muito visíveis), e o componente Button deixa você bastante nervoso - a altura do botão não pode ser alterada, você deve escrever Rectangle e MouseArea em todos os lugares. Se eu estivesse solicitando apenas o Sailfish, usando o design padrão deste sistema operacional, não seria necessário alterar a altura do botão ou seria possível usar um componente da Silica . Mas como eu estou escrevendo um aplicativo para todos os dispositivos, foi decidido usar o design mais maciço (Android), para que todos fiquem familiarizados e confortáveis. Muitos discordam de mim e afirmam que você precisa usar elementos de interface do usuário nativos para cada plataforma, mas esse é um tópico completamente diferente. Ele é objeto de holivares há muitos anos. Durante esse período, mais de uma geração de desenvolvedores cresceu.

Voe na pomada para o desenvolvimento móvel no Qt


  • Assicronismo

No Qt, para se comunicar com o servidor, chamar uma função não é suficiente, você precisa enviar uma solicitação e solicitar um objeto especial responsável pela resposta do servidor, chamar a função de processamento de resposta (que, é claro, nós nos escrevemos), quando a resposta é recebida:

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; } 

A função onReplyFinished será chamada quando uma resposta for recebida do servidor, e isso pode levar não importa quanto tempo dependa da qualidade da conexão e do lado do servidor. Agora imagine como tudo isso será organizado com solicitações 1500-2000, que neste caso dependem umas das outras e devem ser executadas em ordem estrita. E se você se lembrar de que toda a parte da interface do usuário depende da resposta, ela se torna completamente assustadora.

  • Programação orientada para muletas ou uma abordagem criativa para resolver problemas

Outro tópico é o ListView, que é um problema Qt muito local, mas ainda desagradável.

Qualquer ListView que se preze deve ter um componente de cabeçalho, que, como o primeiro delegado, insere algum elemento fundamentalmente diferente do restante. Sim, ele faz, sim, ele pinta tudo perfeitamente, se não fosse um "mas": meu delegado ocupa a tela inteira e precisa ser rolado, mas assim que tento rolar para a esquerda no cabeçalho a partir do índice zero, ele basicamente se recusa a isso mostrar cabeçalho. O que fazer sobre isso? Coisas com uma muleta. Uma parte do meu código de formação de modelo para este ListView na parte cpp, que descreve o que está acontecendo com a maior precisão possível:

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

Em seguida, 2 itens independentes são criados no delegado, cuja visibilidade depende do índice.
Quando o índice é zero, vemos um, caso contrário, o outro.

Sumário


Como resultado, recebi um aplicativo que “voa” no Android e iOS e no Sailfish, mais precisamente um aplicativo flexível que se adapta a esses sistemas operacionais. E magia não tem nada a ver com isso. Encontrei uma maneira de evitar conflitos e fazer amigos de todos os sistemas operacionais com o Sailfish substituindo alguns arquivos pelo Sailfish e por todos os outros. Isso nos permitiu selecionar as camadas da interface do usuário para cada sistema operacional no código do aplicativo.

Podemos assumir que demos o primeiro passo - fizemos amizade com o Sailfish. Mas o trabalho ainda não foi concluído. Sailfish e eu vamos para um novo nível de relacionamento - estamos preparando o aplicativo Areopad CSIS para registro no registro (como o aplicativo Sailfish), o que significa que precisaremos adaptá-lo também para o registro.

Espero que tenha sido interessante. Para ser continuado.

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


All Articles