Skocz do zawartości
Komentator

Kurs Qt – #3 – pierwsza aplikacja mobilna na Androida

Pomocna odpowiedź

@rziomber Problemy, które pojawiły się u Ciebie czyli np. wspomniana chęć użycia socketu czy agenta w obrębie kilku klas pojawiają się nieco automatycznie z racji że poruszamy się między klasami, które często są pochodnymi QWidget - chcielibyśmy np, wykonać kilka operacji na tych obiektach z różnych okien (QWidget). Sama technologia widgetów w Qt już jest nieco stara, ale nadal użyteczna i pomaga szybko coś zbudować - stworzenie GUI zajmuje krótką chwilę i możemy zająć się programowaniem logiki. Natomiast już gorzej nadaje się do tworzenia interfejsów aplikacji mobilnych.

Możemy pozbyć się części problemów (ale też wpakować w inne) korzystając z nowej technologii dostarczonej przez Qt - QtQuick. Która skierowana jest na tworzenie aplikacji mobilnych właśnie. Tam mamy jasne rozdzielenie spraw frontendowych i backendowych. Mamy kilka możliwości, ale interesująca może być ta gdzie obsługę wspomnianego BT napisalibyśmy wyłącznie w C++ np. jedna konkretna klasa lub moduł, który nie ma nic wspólnego z wyglądem aplikacji a dostarcza jedynie informacji dla obsługi interfejsu lub przekazuje input użytkownika. Natomiast interfejs napisalibyśmy w QML (język stworzony przez Qt, wykorzystuje JavaScript) i jedynie wywoływalibyśmy bezpośrednio metody, które zdefiniowaliśmy w naszej klasie napisanej w C++. Co więcej obsługa sygnałów i slotów między QML i C++ również jest w pełni wspierana. 

Przejście na QtQuick na początku jest nieco problematyczne i ciężkie w przestawieniu na nowe mechanizmy , ale jak już zrozumie się mechanizmy integracji C++ z QML to dostajemy bardzo potężne narzędzie.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Aktualizacja:

Moje obecne ustawienia na świeżym Ubuntu 18.04.2 LTS: 

  • Qt 5.12.4
  • openJDK
  • NDK 19c (19.2.5345600)
  • SDK 26 (26.1.1)

Przy NDK 20 nie byłem w stanie zbudować nic na Androida. Brakowało mi też kilku narzędzi i pakietów - problem mogły załatwić poniższe komendy (nie wiem, która dokładnie):  

sudo apt install build-essential
sudo apt install clang
sudo apt install libgl1-mesa-dev

Gdyby kogoś irytował fakt, że powtarzają mu się narzędzia w opcjach i przy ich wyborze to należy wyczyścić ustawienia które gromadzi QtCreator:

rm -rf ~/.config/QtProject ~/.local/share/data/QtProject/qtcreator

 

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Czy mógłbym prosić o rozwinięcie w dalszych częściach kursu problematyki sygnałów i slotów? Pojawiły się one w części o komunikacji przez UART, ale rozwiązuje to przy okazji wiele innych problemów ze świata QT. Jako ktoś rozpoczynający przygodę z QT wydaję mi się, że zaoszczędziłbym wiele czasu, gdyby taki kurs pojawił się wcześniej 😉

12 godzin temu, Matthew11 napisał:

 Problemy, które pojawiły się u Ciebie czyli np. wspomniana chęć użycia socketu czy agenta w obrębie kilku klas pojawiają się nieco automatycznie z racji że poruszamy się między klasami, które często są pochodnymi QWidget - chcielibyśmy np, wykonać kilka operacji na tych obiektach z różnych okien (QWidget).

Podobne zagadnienie pojawiło się w projekcie aplikacji wysyłającej SMSy do bazy kontaktów. Program "rozmawia" przez port szeregowy z modułem GSM - UART. Okno główne (edycyjne) otwiera drugie z książką adresową (opartą na SQLite). Do przekazywania danych z okna do okna (a tym samym między klasami) użyłem mechanizmu Signal - Slot.

518565938_SMSSender.thumb.png.9bf5f5c778e1c00e1bbad60c0bc611e6.png  797294761_SMSSender2.thumb.png.356dc8a97a07d84d832cb73a6b4580a9.png

Przy tworzeniu nowego okna :

void MainWindow::on_phoneBook_clicked()
{
    PhoneBook phonebook;
    phonebook.setModal(true);
    connect(&phonebook, SIGNAL(sendSignal(QString)), this, SLOT(setSlots(QString)));
    phonebook.exec();
}

Wysyłanie danych z drugiego okna:

QString str = "costam";
emit sendSignal(str);

Odbieranie danych w oknie głównym:

void MainWindow::setSlots(QString receivedData){
    // w receivedData mamy dane z drugiego okna
}

Pamiętać należy, że metoda odbierająca dane musi być zadeklarowana w pliku nagłówkowym (.h) w kategorii "slots"

private slots:
    void setSlots(QString receivedData);

a nadawcza w "signals":

signals:
  void sendSignal(QString);

 

Edytowano przez rziomber

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@rziomber Kurs na samym początku zakładał tylko cztery części - wprowadzenie do Qt, port szeregowy, Android i Bluetooth - podstawowe rzeczy, które mogą być przydatne w projektach. Zobaczymy może powstanie więcej części np. o QtQuick i QML oraz sieciach (TCP, UDP).

Jeśli chodzi o sygnały i sloty to polecam Pana o którym wspominałem w pierwszej części:
https://www.youtube.com/watch?v=JtyCM4BTbYo,
https://www.youtube.com/watch?v=qEGRYYx0RBw

Jest też taka książka (jest ich więcej w sieci) - http://www-cs.ccny.cuny.edu/~wolberg/cs221/qt/books/C++-GUI-Programming-with-Qt-4-1st-ed.pdf - rozdział 2 Signals and Slots in Depth

I tak, w twojej aplikacji rozsyłającej SMS masz bardzo dobry przykład użycia tego mechanizmu.

Edytowano przez Matthew11
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Aktualizacja:

Moje obecne ustawienia na świeżym Ubuntu 18.04.3 LTS: 

  • Qt 5.12.5
  • openJDK (instalacja przez: $ sudo apt-get install openjdk-8-jdk )
  • NDK r20b (20.1.5948944)
  • SDK 26.1.1

Mogą być wymagane następujące pakiety:

sudo apt install build-essential
sudo apt install libgl1-mesa-dev

W ustawieniach QtCreatora ścieżki do narzędzi  (za $USER wstaw swoja nazwę użytkownika)

JDK location: /usr/lib/jvm/java-8-openjdk-amd64
Android SDK location: /home/$USER/Android/Sdk
Android NDK location: /home/$USER/Qt/Android/android-ndk-r20b

JDK i SDK standardowo znalazło się w podanych folderach, lokalizacja NDK to mój wybór.

Jedyny problem jaki miałem, to w trakcie budowania:

Checking the license for package Android SDK Build-Tools 28.0.3 in /home/mateusz/Android/Sdk/licenses
Warning: License for package Android SDK Build-Tools 28.0.3 not accepted.

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'android-build'.
> Failed to install the following Android SDK packages as some licences have not been accepted.
     build-tools;28.0.3 Android SDK Build-Tools 28.0.3
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
  Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html
  
  Using Android SDK: /home/mateusz/Android/Sdk

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 7s
Building the android package failed!
  -- For more information, run this command with --verbose.
11:35:03: The process "/home/mateusz/Qt/5.12.5/android_arm64_v8a/bin/androiddeployqt" exited with code 14.

Rozwiązujemy przez wywołanie poniższego i zaakceptowanie wszystkich licencji, sdkmanager znajdziemy w katalogu /home/$USER/Android/Sdk/tools/bin

./sdkmanager --licenses

więcej info tutaj: https://stackoverflow.com/a/43003932

Edytowano przez Matthew11
  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Czy ktoś miał problem z tym że nie widać urządzenia w QT Creatorze? Telefon jest widoczny przez komputer.

image.thumb.png.0aad3e2bb8b8798c1f7070cd268b739c.png

Udostępnij ten post


Link to post
Share on other sites

@dkrakowski Wygląda jak brak włączonego debugowania USB w opcjach programistycznych w opcjach telefonu.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

@Matthew11 Debugowanie mam włączone, testowałem na dwóch telefonach i nie widzi żadnego. Czy są jeszcze jakieś powiązane opcje które należy zmodyfikować? 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Matthew11 Hmmm, wydaje mi się że cały proces podłączenia telefonu do komputera w celu debugowania został opisany w artykule ze szczegółami (przynajmniej mam taką nadzieję) i jeśli są dodatkowe kroki to o nich po prostu nie wiem.

Jak podłączam mój telefon to widzę belkę "Podłączono moduł debugowania USB" więc to pierwszy krok żeby się upewnić że debugowanie jest aktywne. Jak podłączyłem telefon pierwszy raz to przy otwartym oknie deploy (to które pokazałeś) miałem identyczną sytuacje - nie wykrywa telefonu - włączyłem opcje debugowania pojawiła się belka i wtedy zrobiłem "Odśwież ..." albo stało się to automatycznie i Qt (prawdopodobnie) wysłało informację do telefonu i na telefonie musiałem zezwolić na debugowanie USB (pojawia się wtedy okienko z RSA itp). Po akceptacji, Qt wykryło telefon. Miałeś taki komunikat? To jest bardzo kluczowy etap.

Potencjalne problemy:
1. wybierasz złą architekturę (tam przy przycisku run/uruchom)
2. masz starszego Androida niż 4.1 (w co wątpię)
3. inny nieznany problem

Bieda-rozwiązanie - budujesz normalnie aplikację, potem przenosisz ręcznie wynikowy .APK na telefon i instalujesz (słabe, bo nie masz debugowania... ale powinno działać).

Inne rozwiązanie - tworzysz wirtualne urządzenie Android i testujesz lokalnie. Potem dystrybuujesz pliki apk na konkretny telefon

Edytowano przez Matthew11
  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...