https://github.com/naghim/fft-lab12
https://github.com/naghim/fft-lab12
Last synced: 7 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/naghim/fft-lab12
- Owner: naghim
- Created: 2022-04-03T19:52:57.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2024-04-17T08:43:39.000Z (over 1 year ago)
- Last Synced: 2025-02-25T12:48:55.950Z (11 months ago)
- Size: 4.88 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Labor 12
## Networking
A Qt-ban lehetőség adódik az internetről letölteni különféle adatokat. Akár JSON objektumokat, akár nagy méretű állományokat szeretnénk letölteni, használhatjuk a Qt-ban a network modult. A network modul támogatja a sima socket alapú kommunikációkat, illetve a HTTP(s) alapú kapcsolatokat is.
A network modul használatához szükséges beilleszteni a projekt állományba, amely qmake esetén a következő módon történik:
```qmake
QT += network
```
CMake használata esetén:
```cmakelists
find_package(Qt6 REQUIRED COMPONENTS Network)
target_link_libraries(mytarget PRIVATE Qt6::Network)
```
A network modull aszinkron módon végzi el a hálózati hívásokat, így nem veszi el a felhasználói felülettől a futtatási jogot (nem blokkolja a Qt main threadet). Ahhoz, hogy választ kapjunk a network modulltól, használhatjuk a QNetworkReply által szolgáltatott eseményeket. Ha nagyobb állományt töltünk le, használhatjuk a downloadProgress nevű eseményt, hogy valós időben visszajelzést kapjunk a letöltés állapotáról. A finished esemény segítségével le tudunk futtatni saját kódot, amennyiben véget ért a letöltés.
Példa JSON adatok letöltésére és feldolgozására, publikus API-t felhasználva:
```cpp
// Lekérjük a hőmérsékletet egy publikus API-ról
QNetworkAccessManager manager;
QNetworkRequest request;
QUrl url = QUrl("https://wttr.in/Targu+Mures?format=j1");
request.setUrl(url);
QNetworkReply *reply = manager.get(request);
// A network modul aszinkron módon kéri le az adatokat.
// Ezért szükséges rácsatlakoznunk egy callback függvénnyel
// Qt-ben ezt az eventekkel valósítjuk meg
QObject::connect(reply, &QNetworkReply::finished, [&]() {
// Ha nem történt hiba a kérés során...
if (reply->error() == QNetworkReply::NoError) {
// Beolvassuk a HTTP kérésből a választ
QByteArray responseData = reply->readAll();
// A választ alakítsuk át JSON objektummá, hogy könnyebben tudjuk feldolgozni
QJsonDocument jsonResponse = QJsonDocument::fromJson(responseData);
QJsonObject jsonObject = jsonResponse.object();
// Ez a lista tartalmazza az eddig mért időjárásokat
QJsonArray currentCondition = jsonObject.value("current_condition").toArray();
// A legelső érték a JSON listában a legújabb időjárás
QJsonObject firstCondition = currentCondition.first().toObject();
int tempC = firstCondition.value("temp_C").toString().toInt();
QJsonObject weatherDesc = firstCondition.value("weatherDesc").toArray().first().toObject();
QString weatherDescription = weatherDesc.value("value").toString();
qDebug() << "Hőmérséklet Celsiusban: " << tempC;
qDebug() << "Időjárás leírása:" << weatherDescription;
} else {
// Ha történt hiba, írjuk ki a felhasználónak
qDebug() << "Error:" << reply->errorString();
}
reply->deleteLater();
});
```
A linkre kattintva megtekinthető a böngészőben is, hogy hogyan néz ki ez a JSON válasz: https://wttr.in/Targu+Mures?format=j1.
## Animációk Qt-ben
Qt-ben nagyon egyszerű az objektumok animálása is. Az animációkra használhatóak a QPropertyAnimation, amelynek meg lehet adni, hogy honnan kezdődjön az animáció, hol végződjön az animáció, milyen sebességgel történjen, és milyen görbét írjon le az animáció (például QEasingCurve). A QPropertyAnimation segítségével az objektumunk egy bizonyos tulajdonságát módosítjuk az idő függvényében, mint például a pozícióját vagy az elforgatási szögét.
## Feladatok
1. Készítsünk egy kezdetleges időjárást szemléltető applikációt! Használjuk a fent említett wttr.in publikus API-t. Jelenítsük meg a mért hőmérsékletet Celsius fokban, a mérés idejét, a légnedvességet (humidity) és az érzékelt hőmérsékletet Celsius fokban (feels like C). A felhasználói felületen jelenítsük meg az időjáráshoz megfelelő ikont és leírást is, illetve animáljuk meg az ikont (például napos idő esetén a nap forogjon körbe-körbe).
2. Készítsünk egy alkalmazást, amely segítségével letölthetünk HTTP(s) segítségével egy nagyobb méretű állományt. Használhatjuk a következő linket egy 50 MB méretű állomány letöltésére: https://sabnzbd.org/tests/internetspeed/50MB.bin. A letöltendő linket adjuk meg egy QLineEdit segítségével. A letöltés státuszát jelenítsük meg egy QProgressBar segítségével a felhasználónak! A sikeres letöltés esetén jelenítsünk meg egy QMessageBox-ot. Sikertelen letöltés esetén ugyancsak egy QMessageBox segítségével informáljuk a felhasználót.