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

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

Ú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 knihovna

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

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

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

Vývoj multiplatformní aplikace v Qt

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

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

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

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

Abstraktní třídy, polymorfní struktury

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

PROGRAMOVÁNÍ V C++ CVIČENÍ

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

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

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Cvičení 7: Delphi objekty CheckedBox, Radio- Button, EditBox

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

PREPROCESOR POKRAČOVÁNÍ

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Vector datový kontejner v C++.

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Multiplatformní GUI toolkity

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

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

Výčtový typ strana 67

Pokročilé programování v jazyce C pro chemiky (C3220) 3D grafika v knihovně Qt

Jazyk C++, některá rozšíření oproti C

Funkční objekty v C++.

Množina v C++ (set, multiset).

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Operační systémy. Cvičení 3: Programování v C pod Unixem

15. Projekt Kalkulačka

Jazyk C++ II. Šablony a implementace

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

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

PRÁCE S DOKUMENTEM. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: srpen Ročník: šestý. Vzdělávací oblast: Informatika a výpočetní technika

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Konstruktory a destruktory

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Embedded vývoj v Clutteru a Mx

Úvod do programování. Lekce 1

V ukázce jsou zalomení řádku signalizována znakem a konce odstavců znakem. Nástroje Vkládání odrážek a číslování v nabídce DOMŮ v sekci ODSTAVEC.

KAPITOLA 4 ZPRACOVÁNÍ TEXTU

map, multimap - Asociativní pole v C++.

Dědičnost. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 23.března

Šablony, kontejnery a iterátory

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Množina čísel int stl-set-int.cpp

Tematický celek 03 - Cvičné příklady

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

První kapitola úvod do problematiky

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 7

Operační systémy. Cvičení 4: Programování v C pod Unixem

Vytvoření tiskové sestavy kalibrace

6. Formátování: Formátování odstavce

Algoritmizace a programování

přetížení operátorů (o)

Algoritmizace a programování

Výsledný graf ukazuje následující obrázek.

DUM 06 téma: Tvorba makra pomocí VBA

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Programování II. Návrh programu I 2018/19

Šablony, kontejnery a iterátory

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

VYTVÁŘENÍ DATABÁZÍ, VKLÁDÁNÍ ÚDAJŮ

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Příloha 6. Palety nástrojů

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

Vývojové nástroje jazyka Java

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Excel 2007 praktická práce

Základy C++ I. Jan Hnilica Počítačové modelování 18

GOODWILL vyššší odborná škola, s. r. o. P. Holého 400, Frýdek-Místek

Cvičné příklady Hodina 2

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

KAPITOLA 3 - ZPRACOVÁNÍ TEXTU

ÚLOHA 6. Úloha 6: Stěžejní body tohoto příkladu:

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Obsah, oddíly, záhlaví a zápatí, číslování stránek Word egon. Obsah dokumentu, oddíly, záhlaví a zápatí, číslování

Projekt Obrázek strana 135

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

Transkript:

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

Program rozdělený do několika souborů Zdrojový kód programů v C++ obvykle rozdělujeme do několika souborů tak aby každá větší třída byla umístěna v samostatném souboru *.cpp Název souboru volíme tak aby bylo zřejmé jakou třídu obsahuje, obvykle se shoduje s názvem třídy (např. application.cpp, graphicwidget.cpp) Ke každému souboru *.cpp vytvoříme hlavičkový soubor se stejným jménem ale koncovkou.h Funkci main() je vhodné umístit do samostatného souboru main.cpp Pravidla pro překlad jednotlivých souborů umístíme do souboru Makefile Při práci s knihovnou Qt je Makefile generován pomocí nástroje qmake: nejdříve vygenerujeme soubor projektu (qmake -project) potom odpovídající Makefile (qmake project_name.pro). Toto musíme opakovat pokaždé když přidáme další soubor se zdrojovým kódem nebo vložíme nový hlavičkový soubor do některého souboru *.cpp 2

Vložení hlavičkových souborů Hlavičkové soubory vkládáme na začátek souboru *.cpp pomocí direktivy předprocesoru #include Nejdříve vkládáme hlavičkové soubory knihoven, potom teprve hlavičkové soubory programu Hlavičkové soubory knihoven uvádíme v lomených závorkách <>, tyto soubory budou hledány v systémových adresářích Hlavičkové soubory programu uvádíme v uvozovkách "", tyto soubory budou hledány v adresáři kde se nachází zdrojový soubor *.cpp Vkládáme vždy pouze hlavičkové soubory těch tříd, které v daném souboru používáme /******************* Soubor application.cpp *******************/ #include <iostream> #include <QApplication> #include <QHBoxLayout> #include <QPushButton> #include <QVBoxLayout> #include <QWidget> #include "graphicwidget.h" #include "application.h" using namespace std; 3

Struktura hlavičkového souboru Aby nemohlo dojít k zacyklení vkládání hlavičkových souborů, definujeme pomocí direktivy #define symbolickou konstantu odvozenou vhodným způsobem ze jména souboru, pomocí podmínky #ifndef zajistíme, že překlad se uskuteční pouze tehdy pokud ještě nebyl soubor vložen Na začátek hlavičkového souboru musíme vložit hlavičkové soubory tříd jejichž jména jsou v hlavičkovém souboru použita Do hlavičkového souboru umisťujeme zejména definice tříd /******************* Soubor application.h *******************/ #ifndef APPLICATION_H #define APPLICATION_H #include <QApplication> #include "graphicwidget.h" class Application : public QApplication { // Zde budou uvedeny cleny tridy }; #endif 4

Makro Q_OBJECT U tříd knihovny Qt odvozených z QObject a jejich potomků (tj. např. QApplication, QWidget) vložíme na začátek definice třídy makro Q_OBJECT, které je nezbytné pro zajištění některých specifických vlastností knihovny Qt // Ukazka definice tridy Application v souboru application.h class Application : public QApplication { Q_OBJECT public: Application(int &argc, char *argv[]); virtual ~Application(); int run(); private: QWidget* mainwindow; GraphicWidget* graphicwidget; }; 5

Interaktivní prvky v knihovně Qt Knihovna Qt obsahuje různé interaktivní prvky ("widgety"), které slouží pro ovládání programu uživatelem Pro každý interaktivní prvek existuje v Qt knihovně příslušná třída, např.: QPushButton tlačítko po jehož stisnutí myší se vykoná specifikovaná operace (tlačítko obsahuje textový popisek) QToolButton také tlačítko, ale místo textu obsahuje obrázek (používá se hlavně v nástrojových lištách) QCheckBox prvek se dvěma stavy (vybrán / nevybrán) QRadioButon prvek se dvěma stavy, používá se ve skupině několika těchto prvků z nichž je vybrán vždy jen jeden 6

Interaktivní prvky v knihovně Qt Další interaktivní prvky knihovny Qt: QLabel textový popisek QListView seznam textových položek QTreeView hiearchicky uspořádaný seznam QComboBox políčko které po kliknutí zobrazí seznam položek ze kterého lze vybírat QLineEdit políčko s jednořádkovým editovatelným textem QTextEdit políčko s víceřádkovým editovatelným textem QSpinBox políčko pro specifikaci číselné hodnoty QScrollBar posuvník (vodorovný nebo svislý) Úplný seznam lze nalézt na: http://doc.qt.io/qt-5/qtwidgets-index.html http://www.informit.com/articles/article.aspx?p=1405224&seqnum=6 7

Rozvržení prvků v okně Pro automatické rozmístění interaktivních prvků v okně používáme objekty tříd QHBoxLayout a QVBoxLayout QHBoxLayout rozmisťuje objekty horizontálně, QVBoxLayout je rozmisťuje vertikálně Objekt typu QHBoxLayout nebo QHBoxLayout potom přiřadíme do okna metodou setlayout() třídy QWidget Pro přidávání widgetů do objekt typu QHBoxLayout nebo QHBoxLayout používáme metodu addwidget() Objekt typu QHBoxLayout nebo QVBoxLayout zajistí nastavení pozice a velikost prvků a také mezery mezi nimi Window Title mainwindow QPushButton layout QPushButton 8

Rozvržení prvků v okně příklad 1 // Program vytvori okno a do nej budou vlozeny dve tlacitka // usporadana vertikalne nad sebou pomoci objektu QVBoxLayout mainwindow = new QWidget; mainwindow >setwindowtitle("program vytvoreny v Qt!"); // Vytvorime dve tlacitka QPushButton* button1 = new QPushButton("Button 1"); QPushButton* button2 = new QPushButton("Button 2"); // Vytvorime objekt QVBoxLayout ktery bude rozmistovat tlacitka // vertikalne nad sebou, pozice a velikost se nastavi // automaticky QVBoxLayout *layout = new QVBoxLayout(); // Tlacitka pridame pomoci metody addwidget() layout >addwidget(button1); layout >addwidget(button2); // Do hlavniho okna nastavime prislusny layout mainwindow >setlayout(layout); 9

Rozvržení prvků v okně Objekty typu QHBoxLayout nebo QVBoxLayout lze vkládat do sebe pomocí medody addlayout() Kombinací objektů typu QHBoxLayout nebo QVBoxLayout můžeme vytvořit i složitější rozmístění objektů Při roztažení okna jsou objekty rozmisťovány tak aby byly centrované a mezery mezi nimi proporcionální, toto chování lze ovlivnit vložením "pružiny" metodou addstretch() Window Title GraphicWidget QPushButton QPushButton mainwindow mainlayout (QHBoxLayout) rightlayout (QVBoxLayout) pružina 10

Rozvržení prvků v okně příklad 2 // Program vytvori okno a do nej bude vlozen widget // typu GraphicWidget a na pravo budou dve tlacitka nad sebou mainwindow = new QWidget; mainwindow >setwindowtitle("program vytvoreny v Qt!"); graphicwidget = new GraphicWidget; // Pro objekt test_widget nastavime minimalni velikost graphicwidget >setminimumsize(300, 350); QPushButton *buttonhide = new QPushButton("Hide"); QPushButton *buttonshow = new QPushButton("Show"); QVBoxLayout *rightlayout = new QVBoxLayout; rightlayout >addwidget(buttonhide); rightlayout >addwidget(buttonshow); // Pod tlacitka pridame pruzinu rightlayout >addstretch(); QHBoxLayout *mainlayout = new QHBoxLayout; mainlayout >addwidget(graphicwidget); mainlayout >addlayout(rightlayout); // Do hlavniho okna nastavime prislusny layout mainwindow >setlayout(mainlayout); mainwindow >show(); 11

Komunikace mezi objekty v Qt Ke komunikaci mezi objekty v Qt knihovně slouží systém tzv. sinálů a slotů (signals and slots) Signály a sloty se používá nejčastěji pro zaslání informace od interaktivního objektu (např. informace o stisknutí tlačítka) do jiného objektu (hlavního okna nebo jiného widgetu) Signál je metoda vytvořená v objektu od něhož signál pochází Slot je metoda, kterou vytvoříme ve třídě která bude zpracovávat zaslaný signál Signály a sloty jsou ve třídách deklarovány ve speciálních sekcích označených signals a slots Ve třídě QPushButton je definován signál clicked(), který je generován po stisknutí tlačítka Propojení mezi zaslaným signálem a slotem provedeme pomocí funkce connect: QObject::connect(object1, signal, object2, slot); Podrobnější popis se nachází na: http://doc.qt.io/qt-5/signalsandslots.html 12

Komunikace mezi objekty v Qt příklad // Dklarace slotu ve tride GraphicWidget v souboru graphicwidget.h class GraphicWidget : public QWidget { Q_OBJECT private slots: // Nasledujici metody slotu budou volany po zmacknuti // prislusnych tlacitek Hide a Show void hidegraphic(); void showgraphic(); // Deklarace dalsich clenu tridy }; // Program ukazuje propojeni mezi signalem clicked() od dvou // tlacitek se sloty v objektu tridy GraphicWidget graphicwidget = new GraphicWidget; QPushButton* buttonhide = new QPushButton("Hide"); QPushButton* buttonshow = new QPushButton("Show"); // Signal clicked() z tlacitka buttonhide zpusobi volani metody // hidegraphic() definovane ve tride GraphicWidget QObject::connect(buttonHide, SIGNAL(clicked()), graphicwidget, SLOT(hideGraphic())); // Podobne pro tlacitko buttonshow bude volana metoda // showgraphic() definovana ve tride GraphicWidget QObject::connect(buttonShow, SIGNAL(clicked()), graphicwidget, SLOT(showGraphic())); 13

Definice slotu Vhodné signály jsou zpravidla již předdefinované ve třídách Qt knihovny, většinou potřebujeme definovat pouze sloty Metody slotu obsahují kód reagující na signál // Definice metody slotu, která je zavolána po stisknutí // tlacitka buttonhide void GraphicWidget::hideGraphic() { // Vypiseme informaci o stisknuti tlacitka na terminal cout << "Bylo stisknuto tlacitko Hide" << endl; // Do promenne displayrectangle priradime hodnotu false // indikujici ze obdelnik nema byt vykreslovan displayrectangle = false; } // Vyvolame pozadavek na prekresleni okna metodou update() update(); 14

Dialogová okna v knihovně Qt V knihovně Qt můžeme vytvářet dialogová okna, která odvozujeme ze třídy QDialog V knihovně je předdefinováno několik nejčastěji používaných dialogových oken: QFileDialog dialogové okno pro výběr souboru nebo adresáře QColorDialog dialogové okno pro výběr barvy QFontDialog dialogové okno pro výběr fontu QMessageBox dialogové okno pro zobrazení textové informace uživateli QInputDialog dialogové okno pro získání textové nebo číselné hodnoty od uživatele Úplný seznam se nachází na: http://doc.qt.io/qt-5/dialogs.html 15

Dialogové okno pro výběr souboru Pro jednoduchou práci s dialogovými okny jsou v Qt knihovně předdefinovány statické metody které automaticky vytvoří příslušný objekt dialogového okna a okno zobrazí Dialogové okno pro vybrání souboru lze otevřít metodou QFileDialog::getOpenFileName(), která vrátí jméno souboru // Nasledujici metoda je zavolana po stisknuti tlacitka pro // otevreni souboru void GraphicWidget::openFile() { // Knihovna Qt pouziva pro retezce tridu // QString misto string QString filename; // Dialogove okno pro vyber souboru otevreme nasledujici metodou, // ktera vrati jmeno souboru jako retezec typu QString filename = QFileDialog::getOpenFileName(this, "Open", "."); // Pokud nebylo vybrano jmeno souboru, je retezec prazdny if (filename.isempty()) return; // Standardni vystupni proudy umi pracovat jen s promennymi typu // string, na ktere musime konvertovat promennou filename ktera // je typu QString string strfilename; strfilename = filename.tolatin1().constdata(); cout << "Jmeno souboru: " << strfilename << endl; } 16

Třída QMainWindow Hlavní okno aplikace se v knihovně Qt obvykle odvozuje ze třídy QMainWindow, která poskytuje možnost pro vytváření menu, nástrojových lišt, informační lišty a další pokročilé funkce Více informací: http://doc.qt.io/qt-5/qmainwindow.html 17

Hierarchie tříd v knihovně Qt Třídy v Qt knihovně jsou zpravidla odvozeny z jiných tříd a vytváří tak hirerarchickou strukturu Třídy odvozené z QObject jsou schopny komunikace prostřednictvím systému signálů a slotů Podrobnější informace na: http://doc.qt.io/qt-5/hierarchy.html QObject QCoreApplication QWidget QLayout QApplication QBoxLayout QHBoxLayout QAbstractButton QAbstractSpinBox QFrame QPushButton QSpinBox QLabel 18

Dodržujte následující pravidla V hlavičkovém souboru vždy použijte direktivy uvedené v sekci "Struktura hlavičkového souboru". Na začátek souborů *.cpp vložte vždy jen hlavičkové soubory s těmi třídami, které v daném souboru opravdu používáte. Některé překladače obsahují chybu způsobující pád programu. V takovém případě je potřeba v souboru Makefile změnit na řádku začínajícím CXXFLAGS optimalizaci z -O2 na -O1 nebo -O Do adresáře s projektem ani jeho podadresářů neumísťujte žádné jiné soubory *.cpp a *.h než ty, které jsou pro projekt potřeba. Tyto soubory by totiž byly automaticky zahrnuty do souboru projektu (při jeho generování příkazem qmake -project) a byly by tedy i kompilovány. 19

Cvičení 1. Vytvořte program vycházející z programu z předchozího cvičení, který bude v hlavním okně obsahovat widget GraphicWidget a napravo dvě tlačítka s popisem Hide a Show. Po stisknutí prvního tlačítka dojde ke schování obdélníku (tj. okno se překreslí ale vykreslí se jen elipsa a čára). Po stisknutí druhého tlačítka se obdélník opět zobrazí. 3 body 2. Do programu přidejte třetí tlačítko po jehož stisknutí se zobrazí dialogové okno pro výběr souboru. Po vybrání souboru se jeho jméno vypíše na terminál a také se zobrazí v okně s grafikou. 2 body 20