Caraku seorang pejuang, atau bagaimana aku menyiapkan aplikasi untuk hidup di Sailfish

Seni seorang pejuang adalah menjaga keseimbangan
antara kengerian menjadi manusia dan keajaiban menjadi manusia.
"Perjalanan ke Ixtlan"

Path of warrior saya - pengembang frontend brutal pada pro - adalah untuk menemukan keseimbangan antara mengembangkan aplikasi yang berjalan pada Sailfish dan aplikasi lintas platform.

Baru-baru ini, saya telah bekerja pada posisi pengembang di Desain Digital, dan kadang-kadang saya harus berurusan dengan tugas yang belum saya temui sebelumnya. Itu menarik dan sering menyenangkan. Sekarang, misalnya, saya sedang menulis aplikasi perusahaan untuk Sailfish OS dan ingin berbagi pengalaman saya dengan Anda - ini akan dibahas di bawah. Ikuti saya di bawah cut, jika Anda adalah pengembang pemula atau, sama seperti saya, dihadapkan dengan tugas mengadaptasi aplikasi perusahaan untuk OS Sailfish dan tidak tahu harus mulai dari mana, serta mereka yang belum pernah mendengar tentang fitur Qt dan Sailfish.


Sedikit latar belakang, atau mengapa saya melakukannya


Ketika perusahaan itu mengembangkan solusi Areopad ISCO untuk iPad (iOS) 5 tahun yang lalu, tidak ada yang bisa berpikir bahwa pelanggan akan memerlukan aplikasi untuk bekerja pada perangkat dengan Sailfish OS (maka OS itu milik perusahaan Finlandia Jolla, bagaimanapun, sekarang juga). Tetapi pada tahun 2016, perusahaan Open Platform Platform perusahaan Rusia memperoleh lisensi untuk penggunaan, modifikasi, distribusi, dan mengingatkan: ia mengadaptasi perangkat dan pengguna ponsel domestik (terutama perusahaan dan lembaga pemerintah) dan mendaftarkan Sailfish Mobile OS RUS dalam registri . Dan sekarang ini, bisa dikatakan, adalah satu-satunya sistem operasi resmi Rusia untuk perangkat seluler.

Tentu saja, kami ingin memahaminya - kami telah menaklukkan sisa OS, dan Sailfish, tampaknya, memiliki masa depan yang baik (ya, saya sedang berbicara tentang substitusi impor). Dari semua ini maka aplikasi untuk Sailfish menjadi! Aplikasi pertama yang akan diuji adalah Sistem Informasi aplikasi mobile untuk pekerjaan badan-badan kolegial Areopad (itu hanya pada tahap modernisasi).

Sekarang tentang qt


Alat lintas platform yang luar biasa yang mencakup lingkungan pengembangan, satu ton perpustakaan yang bermanfaat dan nyaman, dan bahkan bahasa markah QML Anda sendiri. Saya tidak akan memikirkannya untuk waktu yang lama, karena banyak artikel telah ditulis tentang keajaiban Habré ini, dan Anda juga dapat membaca dokumentasinya , yang dibaca dengan mudah dan alami.

Untuk berjaga-jaga, saya akan mengklarifikasi bahwa perhitungan dan pemetaan dilakukan dalam berbagai bahasa dalam modul yang berbeda (C ++ dan QML) yang berinteraksi satu sama lain menggunakan metode rumit khusus (properti, slot sinyal).

Dan Qt adalah kerangka kerja utama yang digunakan dalam mengembangkan perangkat lunak untuk Sailfish.

Pendekatan untuk memecahkan masalah: ke kiri - Anda akan mendapatkan tongkat penyangga, ke kanan - Anda akan kehilangan fitur


Pada awalnya, terinspirasi oleh ide cross-platform dan fakta bahwa saya akan mengimplementasikannya, saya berpikir bahwa aplikasi yang ditulis untuk Sailfish tidak akan lepas landas, tetapi dengan senang hati gagal pada OS lain, bahkan lemari es atau ketel. Tetapi kebahagiaan saya bertahan sampai saat saya duduk untuk menjalankannya di Android - kemudian saya merasa sedih. Sailfish sama sekali tidak diadaptasi untuk bisnis ini dan jelas tidak bermaksud mengubah apa pun.

Jika Android atau iOS memungkinkan Anda untuk menggunakan kompilasi bersyarat dan menyediakan semacam toolkit untuk ini, maka Sailfish tidak dapat dibedakan dari Linux (tentu saja dalam Qt).

Selanjutnya, masalah kompatibilitas QML muncul: di Sailfish, versi lama Qt Quick (2.6 untuk Sailfish dan sudah 2.11 untuk semua orang), Android tidak mengenal Silica, Sailfish tidak tahu QtQuick.Controls. Oleh karena itu, untuk OS yang berbeda, Anda harus menarik komponen yang sama dari pustaka yang berbeda, yang menghasilkan file yang hampir sama untuk setiap OS.
Pada saat yang sama, Silica mungkin memiliki semua fitur yang sama dengan QtQuick.Controls, tetapi menolak untuk berjalan di platform lain.

Fitur Sailfish


Menjadi orang yang malas, sekreatif mungkin orang kreatif dengan keinginan untuk mengoptimalkan biaya tenaga kerja, saya mengambil jalan resistensi paling tidak fungsional dan menulis karya saya di Qt murni, tanpa menggunakan QtQuick.Controls dan Silica. Hasilnya, semuanya bekerja dengan baik dan bagus di Sailfish, tetapi di Android, setengah dari elemen, meskipun saya harus duduk diam, pergi ke suatu tempat untuk hal-hal penting mereka, jadi langkah selanjutnya masih akan dilakukan pada orang dewasa dan bercerai file markup untuk setiap OS pada sudut yang berbeda. [Yang saya lakukan nanti, sambil menyiapkan artikel untuk publikasi. Kisah ini mengacu pada artikel terpisah]. Harap ingat dan terima: konstanta sihir itu jahat (misalnya, lebar: 15). Dan pada dua perangkat yang hampir identik, bahkan dengan OS yang sama, mereka dapat berbeda sebanyak 2 kali.

Namun, saya tidak bisa tidak mencatat bahwa pasti ada hal-hal menarik dalam versi Sailfish. Tentu saja, untuk waktu yang singkat sehingga saya mengenalnya, hampir tidak mungkin untuk mengetahui seluruh dunia Sailfish yang kaya - hubungan kita dengan dia adalah pada tahap "periode buket permen", dan banyak dari yang belum saya pelajari dalam karakter kompleksnya. Selain itu, diputuskan untuk menggambar aplikasi universal untuk semua OS, jadi saya tidak memiliki kesempatan untuk menggunakan mekanisme yang lebih canggih untuk menggunakan kesempatan tersebut, tetapi saya mungkin akan memberi tahu Anda tentang beberapa poin menarik.

Kami hanya akan berbicara tentang satu perpustakaan untuk mengimplementasikan GUI Silika, karena sisanya yang saya pelajari dan pahami tidak berbeda dari pemrograman QML standar.

  • Tema

Alat ini paling menarik bagi saya karena saya belum melihat analog di OS lain, dan juga tidak rumit. Intinya adalah bahwa desain aplikasi tidak konstan, tetapi tergantung pada topik yang dipilih.

Elemen tema berisi informasi tentang topik yang saat ini dipilih: warna primer, ukuran font, indentasi dan komponen. Jadi, saat menulis aplikasi, Anda tidak perlu membuat hardcode warna, menyesuaikan ukuran agar sesuai dengan layar, dan umumnya melihat tata letak (maafkan para desainer, Anda sudah memiliki banyak pekerjaan), Anda bisa menarik semuanya dari elemen Tema. Yah, itu tidak keren!



  • Menu

Juga merupakan fitur dari Sailfish (walaupun mungkin di Android, tapi saya belum melihatnya).

Ada tiga jenis menu:
PullDownMenu - PushUpMenu - ContextMenu



Adapun Silica ... Lihat - mereka tidak berbeda dari standar ... Lihat (mereka ± beberapa properti tidak terlalu terlihat), dan komponen Tombol membuat Anda cukup gugup - ketinggian tombol tidak dapat diubah, Anda harus menulis Rectangle dan MouseArea di mana-mana. Jika saya membuat aplikasi untuk Sailfish saja, menggunakan desain standar OS ini, tidak perlu mengubah ketinggian tombol atau akan mungkin menggunakan komponen dari Silica . Tapi karena saya menulis aplikasi untuk semua perangkat, diputuskan untuk menggunakan desain yang paling besar (Android), sehingga semua orang akan terbiasa dan nyaman. Banyak yang tidak setuju dengan saya dan mengatakan bahwa Anda perlu menggunakan elemen UI asli untuk setiap platform, tetapi ini adalah topik yang benar-benar berbeda, ini telah menjadi subjek holivars selama bertahun-tahun, selama ini lebih dari satu generasi pengembang telah berkembang.

Terbang dalam salep ke pengembangan seluler di Qt


  • Assikronisme

Di Qt, untuk berkomunikasi dengan server, memanggil satu fungsi tidak cukup, Anda perlu mengirim permintaan dan meminta objek khusus yang bertanggung jawab atas respons server untuk memanggil fungsi pemrosesan respons (yang, tentu saja, kami menulis sendiri) ketika respons diterima:

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

Fungsi onReplyFinished akan dipanggil ketika respons diterima dari server, dan ini mungkin memakan waktu tidak peduli berapa lama itu tergantung pada kualitas koneksi dan sisi server. Sekarang bayangkan bagaimana semua ini akan diatur dengan 1500-2000 permintaan, yang dalam hal ini bergantung satu sama lain dan harus dijalankan dalam urutan yang ketat. Dan jika Anda ingat bahwa seluruh bagian UI tergantung pada jawabannya, maka itu menjadi sangat menakutkan.

  • Pemrograman berorientasi kruk, atau pendekatan kreatif untuk memecahkan masalah

Topik lain adalah ListView, yang merupakan masalah Qt sangat lokal, tetapi masih tidak menyenangkan.

Setiap ListView yang menghargai diri sendiri harus memiliki komponen header, yang, sebagai delegasi pertama, memasukkan beberapa elemen yang secara fundamental berbeda dari yang lain. Ya, dia melakukannya, ya, dia melukis segalanya dengan sempurna, jika itu bukan untuk satu "tetapi": delegasi saya menempati seluruh layar, dan itu perlu digulir, tetapi segera setelah saya mencoba menggulir ke kiri ke header dari indeks nol, dia pada dasarnya menolak ini tampilkan tajuk. Apa yang harus dilakukan? Barang-barang dengan kruk. Sepotong kode pembentukan model saya untuk ListView ini di bagian cpp, yang menjelaskan apa yang terjadi seakurat mungkin:

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

Selanjutnya, 2 item independen dibuat dalam delegasi, yang visibilitasnya tergantung pada indeks.
Ketika indeksnya nol, kita melihat satu, sebaliknya yang lain.

Ringkasan


Akibatnya, saya mendapat aplikasi yang "terbang" di Android dan iOS, dan Sailfish, lebih tepatnya aplikasi fleksibel yang beradaptasi dengan OS ini. Dan sihir tidak ada hubungannya dengan itu. Saya menemukan cara untuk menghindari konflik dan berteman dengan semua OS dengan Sailfish dengan mengganti beberapa file untuk Sailfish dan yang lainnya. Ini memungkinkan kami untuk memilih lapisan antarmuka pengguna untuk setiap OS dalam kode aplikasi.

Kami dapat berasumsi bahwa kami telah mengambil langkah pertama - kami berteman dengan Sailfish. Tetapi pekerjaan ini belum selesai, Sailfish dan saya akan naik ke tingkat baru hubungan kami - kami sedang mempersiapkan aplikasi CSIS Areopad untuk pendaftaran di registri (seperti aplikasi Sailfish), yang berarti bahwa kami perlu menyesuaikannya juga untuk registri.

Saya harap itu menarik. Untuk dilanjutkan.

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


All Articles