1. Úvod 2. Historie 3. Qt Creator & qmake 4. Rychlý úvod do Qt 5. Základní koncepty Qt 6. Průvodce prvky GUI 7. Projekty

Podobné dokumenty
Úvod 13 O čem je tato kniha? Pro koho je tato kniha? Jak studovat tuto knihu? Poděkování 16 Zpětná vazba od čtenářů Zdrojové kódy ke knize Errata 17

Multiplatformní GUI toolkity

Pokročilé programování v jazyce C pro chemiky (C3220) Knihovna Qt část 2

Uživatelská rozhraní 10. cvičení. Martin Němec A

Vývoj multiplatformní aplikace v Qt

Programátorská příručka

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Zdokonalování gramotnosti v oblasti ICT. Kurz MS Excel kurz 6. Inovace a modernizace studijních oborů FSpS (IMPACT) CZ.1.07/2.2.00/28.

Multiplatformní GUI knihovna

Úvod do programovacích jazyků (Java)

První kapitola úvod do problematiky

Mapa Česka:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Emulátor psaní SMS na mobilním telefonu. (projekt do předmětu ITU)

Formuláře. Aby nám mohli uživatelé něco hezného napsat třeba co si o nás myslí!

KNIHOVNA QT4, PROSTŘEDÍ QTCREATOR A MOŽNOSTI JEJICH VYUŽITÍ

Programování v C++, 2. cvičení

Generické programování

Jazyk C# (seminář 6)

Tiskové sestavy. Zdroj záznamu pro tiskovou sestavu. Průvodce sestavou. Použití databází

Uživatelský manuál - základ PiPO P1

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

Dotyková obrázovká v prográmu TRIFID

VYTVOŘENÍ / EDITACE RDP SOUBORU

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Jarkovský, L. Dušek, M. Cvanová. 5. Statistica

Pro správné zobrazení mapové aplikace je potřeba mít nainstalovaný zásuvný modul Flash Adobe Player.

Kontingenční tabulky v MS Excel 2010

Manuál pro mobilní aplikaci. Patron-Pro

Začínáme s Tovek Tools

Obsah. 1.1 Práce se záznamy Stránka Dnes Kontakt se zákazníkem... 5

8 Třídy, objekty, metody, předávání argumentů metod

DOKUMENTACE REDAKČNÍHO SYSTÉMU PINYA

METODICKÝ POKYN PRÁCE S MS PowerPoint - POKROČILÍ. Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky.

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Ukázka knihy z internetového knihkupectví

Více o konstruktorech a destruktorech

PB161 Programování v jazyce C++ Přednáška 4

1 Webový server, instalace PHP a MySQL 13

Ovládání Open Office.org Calc Ukládání dokumentu : Levým tlačítkem myši kliknete v menu na Soubor a pak na Uložit jako.

Územní plán Ústí nad Labem

Konstruktory a destruktory

PROJEKT ŘEMESLO - TRADICE A BUDOUCNOST Číslo projektu: CZ.1.07/1.1.38/ PŘEDMĚT PRÁCE S POČÍTAČEM

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

FIO API PLUS. Verze 1.1.1

Alcohol Meter - uživatelská příručka

Základy HTML. Autor: Palito

Použití Office 365 na telefonu s Androidem

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

1 Administrace systému Moduly Skupiny atributů Atributy Hodnoty atributů... 4

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

1. Dědičnost a polymorfismus

Gymnázium Ostrava Hrabůvka, příspěvková organizace Františka Hajdy 34, Ostrava Hrabůvka

Dotykova obrazovka v programu TRIFID

Microsoft. Access. Tiskové sestavy. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

NÁVOD NA OBSLUHU INTERNETOVÉ PREZENTACE. Ataxo Czech s.r.o.

StatSoft Jak vyzrát na datum

Uživatelský manuál - základ PiPO P9 (3G)

Obsah Úvodem... 5 Co je to vlastně formulář... 6 Co je to šablona... 6 Jak se šablona uloží... 6 Jak souvisí formulář se šablonou...

Semestrální práce 2 znakový strom

Vytváření DVD s DVDStyler

Jazyk C# (seminář 9)

Connection Manager - Uživatelská příručka

Návod k ovládání aplikace

Dotyková obrázovká v prográmu TRIFID

Write-N-Cite - stručný návod

Redakční systém Joomla. Prokop Zelený

Projektová dokumentace GED 2006

Dokumentace pro správu zlínských DUM

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Uživatelský manuál - základ PiPO U6

Základní nastavení systému Windows 7

Použití databází. Mnoho postupů, které si ukážeme pro prací s formulářů využijeme i při návrhu tiskových sestav.

Návod k Zoneramě v roce 2016

Manuál QPos Pokladna V1.18.1

1 Návod na instalaci prostředí LeJOS-NXJ a přehrání firmwaru NXT kostky

Přechod z Google Apps na Office 365 pro firmy

Comenius Logo. Princip programování. Prostředí Comenius Logo

Návrh uživatelských rozhraní NOV-WEB. Jakub Bartoš, Pavel Dvořák, Jakub Motyčka, Kamil Procházka

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Hotline Helios Tel.: Pokročilé ovládání IS Helios Orange

WinFAS. 5 účto. Praktický úvod do WinFASu Prohlížení knih

Projekt Obrázek strana 135

Maturitní projekt do IVT Pavel Doleček

Alsenta.com Zbynek Lakomý

Hydroprojekt CZ a.s. WINPLAN systém programů pro projektování vodohospodářských liniových staveb. HYDRONet 3. Modul SITUACE

Programování v C++ 1, 1. cvičení

MATURITNÍ PRÁCE dokumentace

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Využití programu GeoGebra v Matematické analýze

KMI / TMA Tvorba mobilních aplikací. 9. seminář ZS 2016/2017 Středa 13:15-15:45

Tabulkový procesor. Základní rysy

Dědění, polymorfismus

Knihovna QT4 a moºnosti jejího vyuºití

Transkript:

Qt 1. Úvod 2. Historie 3. Qt Creator & qmake 4. Rychlý úvod do Qt 5. Základní koncepty Qt 6. Průvodce prvky GUI 7. Projekty

Úvod Ondřej Kolín Qt jsem učil 4 roky na SPŠMB Neočekávejte technické zázraky, nejsem zkušený programátor Něco jsem už napsal, tuším, co jsou to třídy a objekty 2

Qt Proč by Vás mělo zajímat? 1. Opensource 2. Velká komunita 3. Aktivní vývoj 4. Dostupné nástroje 5. Multiplatformní, včetně mobilních platforem 3

Proč by vás nemělo zajímat 1. Licence 2. Chcete velmi lehkou aplikaci (Qt minimal) 3. Vlastní makra 4. Nekonzistentnost pojmenovávání oproti standardním knihovnám 5. Nechcete psát v C++ 4

Historie Kdo stojí za Qt? 1991 - Trolltech, Haavard Nord and Eirik Chambe-Eng Mezitím: Změny licencování, K Desktop Enviroment, podpora FSF 2008 - Trolltech koupila Nokia 2011 - Nokia prodává komerční licencování společnosti Digia 5

Qt Creator Qt Creator je jedno z nejdotaženějších IDE na Linuxu Qt.io Výhody: 1. Není Java-based 2. Integrovaný Qt Designer 3. Přehledné Nevýhody: 1. Licence 2. Zaměřené na Qt a C++ 6

Licencování Qt Creatoru Kup si Qt, za 459 $ měsíčně. 7

Kompilace Qt projektů Vztah qmake a make nástroj qmake připraví makefile, ten zkompiluje make, který volá už překladač (respektive sadu nástrojů překladače). Qt Creator qmake soubor bere jako projektový, tzn. soubory.pro jsou soubory Qt Creatoru a projekty jde bez instalace QtCreatoru přeložit. qmake -> make ->... 8

Instalace qmake v odpovídající verzi sudo dnf install qt-devel sudo apt install qt5-qmake Dokumentace sudo dnf install qt-doc sudo apt install qt5-doc A překladač C++ samozřejmě. sudo dnf install g++ sudo rpm install gcc-c++ 9

Nastavení v Qt Creatoru Tools -> Options 1. Compilers 2. Qt versions 3. Kits (To je compiler + qmake) Můžete experimentovat s různými verzemi, přidat platformy (Android, apod.) 10

Můj první projekt New project -> Applications -> Qt Widgets Application Projektový soubor je "qmake soubor" Soubory jsou podle 3 kategorií: 1. Hlavičkové soubory 2. Zdrojové soubory 3. Ui soubory.ui soubory jsou ve formátu xml a editují se přes Qt Designer Celá aplikace běží ve smyčce, která zpracovává události uživatelského prostředí. 11

Třída MainWindow Jak z ui souboru dostanu svoje prvky? mainwindow.ui -> ui_mainwindow.h -> #include <ui_mainwindow.h> -> ui->setupui() Hierarchie QMainWindow -> QWidget -> QObject & QPaintDevice 12

Widgety Všechno je widget. Tlačítko, seznam, atd. Widgety jsou řazeny hierarchicky. Hierarchie se tvoří pomocí QWidget *parent Smazání rodičovského prvku vede ke smazání potomka, automatická správa paměti QWidget definuje obrovskou spoustu věcí, události, metody, apod. Layouty Pokud chci do jednoho widgetu (objekt třídy QWidget ) vložit více prvků využiju setlayout(qlayout *layout). Layouty umožňují různé typy rozložení. V layoutu typicky chceme definovat chování velikosti (roztahuje se, neroztahuje), min. rozměry a další. 13

Pár poznámek k Widgetům centralwidget bývá typicky obyčejný objekt třídy QWidget s nastaveným layoutem. Pokud si tam dáte něco jiného, tak se Vám stane, že změny v Qt Designeru se neprojeví, protože se logicky nemají kam vložit ( QPushButton nemůže mít děti) 14

QObject... je defacto všechno co interaguje. V kombinaci s makrem Q_OBJECT slouží k implementaci interakce pomocí signálů a slotů. (česky signálů a zdířek) 15

Signály a sloty Každý Widget a obecněji objekt mají definované události. Při vyvolání události dojde ke spuštění všech propojených metod. Propojování se používá funkce QObject::connect void sayhello() { label->settext("hello. Is that me you are looking for?"); } //konstruktor MainWindow::MainWindow (QWidget *parent = nullptr) { QPushButton *tlacitko = new QPushButton("Push me hard!"); connect(tlacitko, &QPushButton::clicked, this, &MainWindo } Můžeme samozřejmě spojovat i složitější signály, třeba ty co něco vrací, musí odpovídat parametry. Respektive, nemůže slot chtít nějaké parametry, které signál nedává. connect(posuvnik, &QSpinBox::valueChanged, popisek, &Label::se 16

Qt Designer Polografický přístup Qt Designer umí automaticky vytvořit sloty pro události. Stačí klepnout pravým na prvek Go to slot a vybrat událost. Pozor, že při mazání musíte odebrat deklaraci i z hlavičkového souboru. 17

Plně grafický přístup Defacto simuluje to, co jsme dělali v příkladu s posuvníkem. Přepnete si na režim editace signálů a slotů (malinké tlačítko v Qt Designeru, nebo klávesa F4 ) a spojováním ve stylu drag'n'drop spojujete prvky. V tabulce vybíráte reakce na události. 18

Jak zjistím, kdo vyvolal událost? QObject::sender() Použití: QPushButton *zdrojove_tlac = static_cast<qpushbutton *>(QObj 19

Poznámky Qt implementuje spoustu vlastních tříd. Třeba QString pro práci s řetězci. QStringy se dají spojovat pomocí operátoru + Převod číslo <-> řetězec QString retezec = QString::number(42); int cislo = retezec.toint(); QString banner = "LinuxDays" + QString::number(letosni_rok); 20

21

Pro výstup používáme ladění z qdebug.h Příklady výstupů: qdebug() << "Streaming out"; qwarning() << "Screaming out"; 22

Kvízová otázka Jaký bude výsledek v tmp? A proč právě AhojA? int cislo = 65; QString tmp = "Ahoj"; tmp = tmp+cislo; 23

Základní widgety 24

QPushButton Prostě tlačítko. (K prvkům vytvořeným přes Qt Designer přistupujeme typicky přes this->ui->tlaciko->...) Zajímavé signály: clicked(bool checked = False); Zajímavé vlastnosti Vlastnosti (Attributes) se nastavují typicky přes setattribute(hodnota) a získávají přes attribute() není tam get. QString text; // Zobrazeny popisek 25

QLabel Prostě jednořádkový text Zajímavé signály: Skoro žádné, kromě těch zděděných od QObject a pár navíc Zajímavé vlastnosti QString text; // Zobrazeny text, settext(qstring text), QStri Zajímavé metody void QLabel::setNum ( double num ); //Nastavi cislo jako text 26

QLineEdit Jednořádkový vstup pro text Zajímavé vlastnosti QString text; // Zobrazeny text, settext(qstring text), QStri Zajímavé signály: textchanged(); returnpressed(); editingfinished();... 27

QSpinBox a QDoubleSpinBox Abychom nezapomněli na čísla: setvalue(int/double value) //Nastavuje hodnotu ve spinboxu int/double value() // bere hodnotu A spoustu zajímavých metod pro nastavování minima, maxima, kroku, apod. Zajímavé metody Spoustu, umí nastavit vzhled, skrývání znaku jako u hesla, maximální délku, předvyplněný text... 28

Čas na základní příklady 29

možná to není nejčistší přístup, ale je to nejjednodušší 2. Udělejte tlačítko pro zlepšení klikače 3. Pokud chcete přidat něco, co vydělává automaticky, tak se mrkněte níže na QTimer. Nebo spíš do dokumentace, jako správný vývojář. 30

2. Jak zmáčkněte něco jiného, zkontrolujte, jestli nemáte už něco uložené, pokud ano, tak to spočítejte a vyplivněte na displej. 3. Chcete, aby na displej šli psát složitější výrazy i se závorkami? Někdo to bude muset parsovat. To už není tak snadné, bude to založené na hledání operátoru, který není v závorkách a rekurzi. Zkuste nad tím pobádat, středoškoláci na to po pár nápovědách a roční přípravě přišli (teda pár z nich) 31

Víceřádkové widgety QTextEdit, QTextBrowser liší se tím, který jde upravovat. Oba umí zobrazovat HTML tagy. Jak něco přidat? settext(qstring text); // čistě technicky nic nepřidává, ale prostě nastavuje sethtml(qstring text); // jako settext, ale pokusí se interpretovat HTML zn appendtext(qstring text); // Připojí text s novým řádkem appendhtml(qstring text); // lautr to samé, ale interpretuje HTML Jak něco získat? Teda jak všechno získat? QString toplaintext(); // dej text QString tohtml(); // dej kompletní html kód 32

A co trochu komplexnější widgety? 33

QComboBox Znáte z HTML jako <select>. Vybíráte prvek z předem dané množiny. Jak do něj nasypat data? QComboBox *combik = new QComboBox(); combik->additem("prvek"); QStringList polozky; // Tohle je QList<QString> polozky << "Prvek taky" << "A za nim dalsi"; combik->additems(polozky); 34

Kdybych chtěl, můžu vložit prvek na konkrétní místo. insertitem ( int index, const QString & text, const QVariant a nebo nastavit konkrétnímu text setitemtext ( int index, const QString & text ) trochu zajímavější je třeba to, že prvkům můžete nastavit nějaká "skrytá data". Třeba, že zobrazujete text, ale máte u nich přiřazenou hodnotu (v html atribute value ). Typicky třeba ID v databázi setitemdata ( int index, const QVariant & value, int role = Qt: 35

Chceme něco číst z QComboBox? int currentindex () const QString currenttext () const 36

QListWidget (item-based) Tohle už je zajímavější, nějaký seznam reprezentovaný jako položky, které je možné mazat, přesouvat, apod. Také znáte, typicky s ikonkami. Chci si třeba udělat seznam lidí, co můžou na oslavu. http://www.poketcode.com/img/pyqt4/qlistwidget.png 37

Tak jdeme na to. Přidávání, nastavování prvků void insertitem ( int row, QListWidgetItem * item ) void insertitem ( int row, const QString & label ) void additem ( const QString & label ) void additem ( QListWidgetItem * item ) void additems ( const QStringList & labels ) void insertitem ( int row, QListWidgetItem * item ) void insertitem ( int row, const QString & label ) void insertitems ( int row, const QStringList & labels ) 38

Koho máme vybraného, co je na řádku x? QListWidgetItem * currentitem () const int currentrow () const Chci někoho odebrat? int radek = ui->seznam->currentrow(); if(radek < 0) return; //-1 dostáváme při nevybraném řádku QListWidgetItem *polozka = ui->seznam->takeitem(radek); delete polozka; // Tady musím paměť uvolnit ručně, nebo bychom třeba mohli přesunout prvek do Tady to je trochu zajímavé, máme dokonce vlastní třídu pro prvky, objektům této třídy můžeme nastavovat některé vlastnosti (nebo je číst samozřejmě), jako: 39

settext(qstring text); settooltip(qstring text); setdata ( int role, const QVariant & value ) Tabulky Tabulkový widget je QTableWidget. Pracuje podobně jako QListWidget, ale má o rozměr více. :-). Mrkněte se do dokumentace. 40

Kreslení Začneme tvořit grafiku skoro jako pastelkami! Qt má dvě třídy, které se používají při vykreslování grafiky. 41

QGrahpicsView && QGRaphicsScene QGrahpicsView - Pohled. Něco, skrze co se koukáme. Něco jako internetový prohlížeč. Definuje, co chceme zobrazit a jak se na to budeme koukat. QGRaphicsScene - Samotná scéna. Vlastně stejně jako v divadle. Na scéně se něco děje a váš pohled ( QGraphicsView ) definuje, co vidíte. Je vhodné si typicky uchovávat ukazatel na scénu. Takže já si v MainWindow.h často udělám QGraphics *scene; No a v konstruktoru už si nějakou tu scénu vytvořím a přiřadím do view vytvořené v návrháři scene = new QGRaphicsScene(); ui->view->setscene(scene); 42

Je libo čtverec, čáru, kružnici nebo snad polygon? scene->addline(100, 200, 300, 400); //Objekty jde přidávat přímo pom //Nebo jako objekty QGraphicsEllipseItem *tmp = QGraphicsEllipseItem(100, 100, scene->additem(tmp); //Nic se nebojte, ze ukazatel ztratite, elipsu po vas Qt Pokud se vam ukazatel na pridany objekt hodi, funkce vam h QGraphicsItem *rect = scene->addrect(0, 0, 50, 50); rect->setx(100); //Presun ctverec na X souradnici 100 //QPoint je bod QPoint a(20, 50), b(200, 100); QPointF c(60.5, 60); //QPointF taky, ale můžu mu dát desetinná čísla beze QPolygonF trojuhelnik; trojuhelnik.append(a); //Pripojime body trojuhelnik.append(b); trojuhelnik.append(c); //Namichame vypln a obrys QPen obrys(qt::blue); //Qt ma nejake konstanty pro barvy pripravene //Vypln bude strafkovana QBrush vypln(qt::red, Qt::FDiagPattern); //Tohle cele pouzijeme pri vkladani polygonu scene->addpolygon(trojuhelnik, obrys, vypln); 43

Časovače Pokud chcete nějakou činnost vyvolat za nějakou dobu, nebo v nějakém intervalu. Ukazatel na časovač se hodí mít někde snadno přístupný, třeba jako členskou proměnnou třídy QMainWindow. Tady je příklad (teda bude) 44

mainwindow.h QTimer *casovac; public slots: void allhailtothehypnotoad(); mainwindow.cpp MainWindow::MainWindow(QObject * parent = nullptr) { casovac = new QTimer(this); //QTimer je potomek QObject, takze pr connect(casovac, &QTimer::timeout, this, &MainWindow::al casovac->setinterval(100); casovac->start(); } MainWindow::allHailToTheHypnotoad() { qdebug() << "Všichni máme rádi hypnožábu a to Každých 100 ms"; } Oboje je redakčně kráceno, šetříme místem 45

46

Čas úkolů podruhé 47

množství. 48

přednostně zobrazovat a nebude se snažit scénu centrovat 2. Při jakékoliv změně v datech překreslete graf (udělejte si na to funkci). Můžete zkusit prvky přesouvat po změně, ale doporučuji je spíše rovnou mazat. 3. Udělejte to přes QTableWidget a můžete mít víc grafů vedle sebe, teda nad sebou a pod sebou. 4. A nezapomeňte na osy (obrázek je vytvořený lenochem) 49

1. qsrand() vám připraví generátor náhodných čísel 2. qrand() vygeneruje náhodné číslo 3. setscenerect(qrectf) určí jaké rozměry má QGraphicsView přednostně zobrazovat a nebude se snažit scénu centrovat 50

Kam dál? Tady jsme u mě v souboru na řádku 533, což se mi zdá jako dost, je na čase, abyste začali pracovat sami. Tady je pár tipů, nad čím přemýšlet dál. 51

Databáze Gui je sice fajn, ale je super k prezentaci nějakých dat. Databáze data už podle jména jde k sobě. Připojit databázi ( QSqlDatabase ) a posílat na ní dotazy ( QSqlQuery ) je prkotina, s SQLITE si jde moc hezky pohrát. Qt umí pracovat s modely. To je pojem známý asi hlavní webařům. Mrkněte se na to, teoreticky jde tabulku s GUI propojit na pár řádcích přes QSqlTableModel 52

Kreslení lvl 2 Kreslit změť koleček a čárek je sranda, ale co takhle komplexnější obrazce? Vytvořte si třídu odvozenou od QGraphicsItem (musíte implementovat), zachytávejte události klávesnice, využijte časované události QTimer a může vzniknout třeba i hra ;). Ačkoliv dělat hru v Qt může jenom sebevrah. (Zdravíme do Mladé Boleslavi pana Kamila K. autora klonu Wacraft I v Qt). 53

; 54

Multimédia Je libo vlastní přehrávač? VLC nemůže přeci mít každý. Zkuste nový KarelNovakPlayer Multimediální soubory je ve QGraphicsView přes QGraphicsScene a QGraphicsVideoItem možné renderovat. 55

JSON Rest API Stáhnout data z internetu, zpracovat je a vykreslit třeba předpověď na 3 dny dopředu. Na trhu s aplikacemi je přeplněno, ale to nevadí, můžete přidat svojí QNetworkManager se bude starat o spojení se světem a když odpověď proženete přes QJsonDocument a získáte potřebná data, můžete vykreslovat sluníčka, mráčky, nebo blesky podle toho, jaké bude počasí 56

Android a jiné platformy Qt jde přeložit i pro Android, vyžaduje to nainstalovat ARM překladač, telefon, či emulátor pár úprav kódu, zapřemýšlení nad ergonomií mobilního telefonu, ale jde to! Web assembly Qt běží i na webu přes projekt WebAssembly. Wow. Ještě jsem to teda nezkoušel, pouze demíčka (a fungují) 57

Díky za pozornost https://facebook.com/ondrej.kolin.5 https://twitter.com/o_kolin ondrej.kolin@gmail.com Mějte se skvěle! 58

59