====== 12. Qt - databáze ====== Cvičení je zaměřeno na vytvoření jednoduché databazáze, do které se ukládá aktuální cena některé z kryptoměn, např. BTC. Pro získání ceny kryptoměny existuje několik webových API, zde použijeme API [[https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR|cryptocompare.com]]. Základ programu je podobný jako ve cvičení, kde jsme získávali informace o aktuálním počasí. Zde je kód umístěn do třídy, kterou budeme dále rozšiřovat. /* kryptomeny.h */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include class kryptomeny : public QMainWindow { Q_OBJECT public: kryptomeny(QWidget *parent = nullptr); ~kryptomeny(); private: Ui::kryptomeny *ui; QSqlDatabase db; QTimer tmr; void fetchData(void); }; }; /* kryptomeny.cpp */ #include "kryptomeny.h" #include "ui_kryptomeny.h" kryptomeny::kryptomeny(QWidget *parent) : QMainWindow(parent) , ui(new Ui::kryptomeny) { ui->setupUi(this); // otevreni a pripadne vytvoreni souboru s databazi db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("kryptomeny.db"); db.open(); // vytvoreni objektu pro prikazy databaze QSqlQuery dbQuery(db); // vytvoreni tabulky krypto, pokud neexistuje dbQuery.exec("CREATE TABLE IF NOT EXISTS krypto (dt DATE, USD float);"); // vlozeni 5 vzorku do databaze for(int i=0; i<5; i++){ dbQuery.exec(QString("INSERT INTO krypto VALUES(DATETIME(), %1);").arg(i)); } // vyhledani vsech hodnot z SQL databaze z tabulky krypto dbQuery.exec("SELECT * FROM krypto;"); // vyhledani indexu danych polozek tabulky QSqlRecord dbRecord = dbQuery.record(); int idDT = dbRecord.indexOf("dt"); int idUSD = dbRecord.indexOf("USD"); // vypsani vsech hodnot z SQL databaze while(dbQuery.next()){ qDebug() << "Date Time: " << dbQuery.value(idDT).toString() << ", Price: " << dbQuery.value(idUSD).toFloat() << " USD"; } tmr.setInterval(1000); tmr.start(); QObject::connect(&tmr, &QTimer::timeout, this, &kryptomeny::fetchData); } void kryptomeny::fetchData(void){ QNetworkAccessManager mgr; QNetworkRequest req(QUrl("https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD,EUR")); QNetworkReply *reply = mgr.get(req); QEventLoop eventLoop; QObject::connect(&mgr, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); eventLoop.exec(); if(reply->error() == QNetworkReply::NoError){ QDateTime dateTime = QDateTime::currentDateTimeUtc(); QJsonDocument json = QJsonDocument::fromJson(reply->readAll()); QJsonObject jsonCrypto = json.object(); qDebug() << dateTime.toString("yyyy-MM-dd hh:mm:ss") << " " << jsonCrypto["USD"].toDouble() << " USD"; } } ===== Kompilace ===== Pro správnou kompilaci programu je třeba do části QT přidat ''sql'' pro databázi, ''network'' pro komunikaci s webovým rozhraním a ''charts'' pro zobrazení dat # crypto.pro TEMPLATE = app TARGET = 01-crypto QT += widgets network sql charts CONFIG += console HEADERS += crypto.h SOURCES += main.cpp