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

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ść
Napisz odpowiedź...

×   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...