Mein Weg als Krieger oder wie ich einen Antrag für das Leben in Sailfish vorbereitet habe

Die Kunst eines Kriegers ist es, das Gleichgewicht zu halten
zwischen dem Schrecken, menschlich zu sein und dem Wunder, menschlich zu sein.
"Reise nach Ixtlan"

Mein Weg des Kriegers - ein brutaler Frontend-Entwickler bei den Profis - bestand darin, ein Gleichgewicht zwischen der Entwicklung einer Anwendung, die auf Sailfish läuft, und einer plattformübergreifenden Anwendung zu finden.

Vor kurzem habe ich bei Digital Design als Entwickler gearbeitet und manchmal muss ich mich mit Aufgaben befassen, die mir vorher noch nicht begegnet sind. Es ist interessant und macht oft Spaß. Jetzt schreibe ich zum Beispiel eine Unternehmensanwendung für Sailfish OS und möchte meine Erfahrungen mit Ihnen teilen - dies wird weiter unten erläutert. Folgen Sie mir unter dem Strich, wenn Sie ein unerfahrener Entwickler sind oder genau wie ich vor der Aufgabe stehen, eine Unternehmensanwendung für OS Sailfish anzupassen, und nicht wissen, wo Sie anfangen sollen, sowie diejenigen, die noch nichts über Qt- und Sailfish-Funktionen gehört haben.


Ein kleiner Hintergrund oder warum ich es getan habe


Als das Unternehmen vor 5 Jahren die Areopad ISCO-Lösung für iPad (iOS) entwickelte, konnte niemand glauben, dass Kunden eine Anwendung benötigen würden, um auf einem Gerät mit Sailfish OS zu arbeiten (damals gehörte das Betriebssystem jedoch auch dem finnischen Unternehmen Jolla). Im Jahr 2016 erwarb das russische Unternehmen Open Mobile Platform eine Lizenz für die Nutzung, Änderung, Verteilung und erinnerte daran: Es passte inländische mobile Geräte und Benutzer (hauptsächlich Unternehmen und Regierungsbehörden) an und registrierte Sailfish Mobile OS RUS in der Registrierung . Und jetzt ist dies, könnte man sagen, das einzige offizielle russische Betriebssystem für mobile Geräte.

Natürlich wollten wir es verstehen - wir haben bereits den Rest des Betriebssystems erobert, und Sailfish hat anscheinend eine große Zukunft (ja, ich spreche von Importsubstitution). Daraus folgt, dass der Antrag für Sailfish sein soll! Die erste Anwendung, die getestet wurde, war das Informationssystem für mobile Anwendungen für die Arbeit der Kollegialorgane Areopad (es befand sich gerade im Modernisierungsstadium).

Nun zu qt


Ein wunderbares plattformübergreifendes Tool, das eine Entwicklungsumgebung, eine Menge nützlicher und praktischer Bibliotheken und sogar Ihre eigene QML-Markup-Sprache enthält. Ich werde nicht lange darauf eingehen, da viele Artikel über dieses Wunder am Habré geschrieben wurden und Sie auch die Dokumentation lesen können, die leicht und natürlich zu lesen ist.

Nur für den Fall, ich werde klarstellen, dass Berechnungen und Zuordnungen in verschiedenen Sprachen in verschiedenen Modulen (C ++ und QML) stattfinden, die mit speziellen kniffligen Methoden (Eigenschaft, Signalschlitz) miteinander interagieren.

Und Qt ist das Hauptframework für die Entwicklung von Software für Sailfish.

Lösungsansätze: Gehen Sie nach links - Sie erhalten eine Krücke, gehen Sie nach rechts - Sie verlieren Funktionen


Zuerst dachte ich, inspiriert von der Idee der plattformübergreifenden Idee und der Tatsache, dass ich sie implementieren werde, dass eine für Sailfish geschriebene Anwendung nicht starten würde, sondern gerne auf jedem anderen Betriebssystem, sogar einem Kühlschrank oder einem Wasserkocher, floppen würde. Aber mein Glück hielt genau bis zu dem Moment an, als ich mich hinsetzte, um es auf Android auszuführen - dann war ich traurig. Sailfish ist überhaupt nicht für dieses Geschäft geeignet und beabsichtigt definitiv nichts zu ändern.

Wenn Sie mit Android oder iOS die bedingte Kompilierung verwenden und dafür ein Toolkit bereitstellen können, kann Sailfish nicht von Linux unterschieden werden (natürlich innerhalb von Qt).

Als nächstes tritt das QML-Kompatibilitätsproblem auf: In Sailfish, der veralteten Version von Qt Quick (2.6 für Sailfish und bereits 2.11 für alle anderen), kennt Android Silica nicht, Sailfish kennt QtQuick.Controls nicht. Daher müssen Sie für verschiedene Betriebssysteme dieselben Komponenten aus verschiedenen Bibliotheken abrufen, wodurch für jedes Betriebssystem fast dieselben Dateien erstellt werden.
Gleichzeitig verfügt Silica wahrscheinlich über dieselben Funktionen wie QtQuick.Controls, weigert sich jedoch, auf einer anderen Plattform ausgeführt zu werden.

Sailfish Features


Als fauler, so kreativer wie möglich kreativer Mensch mit dem Wunsch, die Arbeitskosten zu optimieren, ging ich den Weg des geringsten funktionalen Widerstands und schrieb mein Meisterwerk in reinem Qt, ohne QtQuick.Controls und Silica zu verwenden. Infolgedessen funktioniert auf Sailfish alles anständig und edel, aber auf Android ist die Hälfte der Elemente trotz meiner strengen Anweisung, still zu sitzen, für ihre wahrscheinlich wichtigen Angelegenheiten irgendwohin gegangen, sodass der nächste Schritt immer noch bei einem Erwachsenen und geschieden sein wird Markup-Dateien für jedes Betriebssystem in verschiedenen Winkeln. [Was ich später tat, als ich einen Artikel zur Veröffentlichung vorbereitete. Diese Geschichte stützt sich auf einen separaten Artikel. Bitte denken Sie daran und akzeptieren Sie: Magische Konstanten sind böse (zum Beispiel Breite: 15). Und auf zwei fast identischen Geräten können sie sich sogar mit demselben Betriebssystem um das Zweifache unterscheiden.

Ich kann jedoch nur feststellen, dass die Sailfish-Version definitiv interessante Dinge enthält. Natürlich ist es für eine so kurze Zeit, die ich mit ihm kenne, fast unmöglich, die gesamte reiche innere Welt von Sailfish zu kennen - unsere Beziehung zu ihm befindet sich im Stadium der „Süßigkeiten-Bouquet-Zeit“, und viele davon habe ich noch nicht in ihrem komplexen Charakter studiert. Darüber hinaus wurde beschlossen, eine universelle Anwendung für alle Betriebssysteme zu erstellen, sodass ich nicht die Möglichkeit hatte, ausgefeiltere Mechanismen zu verwenden, um die Chance zu nutzen, aber ich werde Ihnen wahrscheinlich einige interessante Punkte erläutern.

Wir werden nur über eine Bibliothek für die Implementierung der Silica-GUI sprechen, da der Rest, den ich gelernt und verstanden habe, sich nicht von der Standard-QML-Programmierung unterscheidet.

  • Thema.

Dieses Tool hat mich am meisten interessiert, da ich in anderen Betriebssystemen kein Analogon gesehen habe und es auch unkompliziert ist. Das Fazit ist, dass das Anwendungsdesign keine Konstante ist, sondern vom gewählten Thema abhängt.

Das Themenelement enthält Informationen zum aktuell ausgewählten Thema: Primärfarben, Schriftgrößen, Einrückungen und Komponenten. Wenn Sie Anwendungen schreiben, müssen Sie die Farben nicht fest codieren, die Größe an den Bildschirm anpassen und im Allgemeinen das Layout betrachten (verzeihen Sie den Designern, Sie haben bereits viel Arbeit). Sie können einfach alles aus dem Design-Element aufrufen. Na ist das nicht cool!



  • Menü

Auch eine Funktion von Sailfish (obwohl es in Android möglich sein kann, aber ich habe es nicht gesehen).

Es gibt drei Arten von Menüs:
PullDownMenu - PushUpMenu - ContextMenu



Silica ... View - sie unterscheiden sich nicht von der Standard ... View (sie sind ± ein paar nicht sehr auffällige Eigenschaften), und die Button-Komponente macht Sie ziemlich nervös - die Höhe der Button kann nicht geändert werden, Sie müssen überall Rectangle und MouseArea schreiben. Wenn ich nur eine Anwendung für Sailfish unter Verwendung des Standarddesigns dieses Betriebssystems erstellen würde, wäre es nicht erforderlich, die Höhe der Schaltfläche zu ändern, oder es wäre möglich, eine Komponente von Silica zu verwenden . Da ich jedoch eine Anwendung für alle Geräte schreibe, wurde beschlossen, das massivste Design (Android) zu verwenden, damit jeder vertraut und komfortabel ist. Viele sind mit mir nicht einverstanden und sagen, dass Sie native UI-Elemente für jede Plattform verwenden müssen, aber dies ist ein völlig anderes Thema. Es ist seit vielen Jahren Gegenstand von Holivars. In dieser Zeit ist mehr als eine Generation von Entwicklern gewachsen.

Fliegen Sie in der Salbe zur mobilen Entwicklung auf Qt


  • Assychronismus

In Qt reicht es nicht aus, eine Funktion aufzurufen, um mit dem Server zu kommunizieren. Sie müssen eine Anfrage senden und nach einem speziellen Objekt fragen, das für die Antwort des Servers verantwortlich ist. Rufen Sie die Antwortverarbeitungsfunktion auf (die wir natürlich selbst schreiben), wenn die Antwort empfangen wird:

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

Die Funktion onReplyFinished wird aufgerufen, wenn eine Antwort vom Server empfangen wird. Dies kann unabhängig von der Qualität der Verbindung und der Serverseite dauern. Stellen Sie sich nun vor, wie dies alles mit 1500-2000 Anfragen organisiert wird, die in diesem Fall voneinander abhängen und in strenger Reihenfolge ausgeführt werden müssen. Und wenn Sie sich daran erinnern, dass der gesamte Teil der Benutzeroberfläche von der Antwort abhängt, wird es völlig beängstigend.

  • Krückenorientierte Programmierung oder ein kreativer Ansatz zur Lösung von Problemen

Ein weiteres Thema ist ListView, ein sehr lokales Qt-Problem, das jedoch immer noch unangenehm ist.

Jede ListView mit Selbstachtung muss eine Header-Komponente haben, die als erster Delegat ein Element einfügt, das sich grundlegend von den anderen unterscheidet. Ja, er macht es, ja, er malt alles perfekt, wenn es nicht ein "aber" wäre: Mein Delegierter nimmt den gesamten Bildschirm ein und es muss gescrollt werden, aber sobald ich versuche, vom Nullindex nach links zum Header zu scrollen, lehnt er dies grundsätzlich ab Kopfzeile anzeigen. Was tun? Mit einer Krücke stopfen. Ein Teil meines Modellbildungscodes für diese ListView im cpp-Teil, der beschreibt, was so genau wie möglich geschieht:

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

Als Nächstes werden im Delegaten zwei unabhängige Elemente erstellt, deren Sichtbarkeit vom Index abhängt.
Wenn der Index Null ist, sehen wir einen, ansonsten den anderen.

Zusammenfassung


Als Ergebnis habe ich eine Anwendung erhalten, die sowohl auf Android als auch auf iOS „fliegt“, und Sailfish, genauer gesagt eine flexible Anwendung, die sich an diese Betriebssysteme anpasst. Und Magie hat nichts damit zu tun. Ich habe einen Weg gefunden, Konflikte zu vermeiden und alle Betriebssysteme mit Sailfish anzufreunden, indem ich einige Dateien für Sailfish und alle anderen ersetzt habe. Dies ermöglichte es uns, Benutzeroberflächenebenen für jedes Betriebssystem im Anwendungscode auszuwählen.

Wir können davon ausgehen, dass wir den ersten Schritt getan haben - wir haben uns mit Sailfish angefreundet. Die Arbeiten daran sind jedoch noch nicht abgeschlossen. Sailfish und ich gehen auf eine neue Ebene unserer Beziehung. Wir bereiten die Areopad CSIS-Anwendung für die Registrierung in der Registrierung vor (wie die Sailfish-Anwendung), was bedeutet, dass wir sie auch für die Registrierung anpassen müssen.

Ich hoffe es war interessant. Fortsetzung folgt.

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


All Articles