IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 2 - První okno v Qt a C++

V minulé lekci, Instalace Qt frameworku pro C++, jsme si nainstalovali Qt framework spolu s nástrojem Qt Creator a vytvořili svou první aplikaci v Qt, i když pouze konzolovou.

To napravíme hned v dnešním C++ tutoriálu, kde si již vytvoříme své první plnohodnotné okénko :)

První okenní aplikace v Qt a C++

Aplikace toho nebude umět moc, ale jako ukázka pro začátek postačí. Prostě vykreslíme okno a postupně jej trochu vylepšíme a ukážeme si základní techniky pro práci v Qt.

Spustíme tedy Qt Creator, kde si vytvoříme nový projekt, např. pod názvem wokno.

Vytvoření nového projektu v Qt Creator - Qt - Okenní/formulářové aplikace v C++

Vybereme si projekt, který bude používat Qt Widgety. Sice bychom si jej mohli založit i ručně modifikací projektového souboru, ale proč si věci dělat zbytečně složité:

Vytvoření programu používajícího Qt Widgety - Qt - Okenní/formulářové aplikace v C++

Další krok je volba umístění projektu.

Jen musím upozornit, že adresář by měl být vytvořen již předem, nevím proč, ale Qt Creator jej vytvořit neumí.

Výběr umístění nového projektu v Qt Creator - Qt - Okenní/formulářové aplikace v C++

Dále si vybereme sadu pro překlad hotového programu. Screenshot je z Linuxu. Ve Windows zvolte variantu Desktop pro MinGw a architekturu podle svého operačního systému (typicky 64-bitový).

Výběr sady pro založení nového Qt projektu pro C++ - Qt - Okenní/formulářové aplikace v C++

V začátcích nebudeme designer používat. Když si člověk tvoří rozložení aplikace ručně, mnoho se toho naučí a navíc má vše pod kontrolou. Tedy vytvoření formuláře nyní odškrtneme. Jako základní třídu zvolíme QMainWindow.

Důvody této volby si vysvětlíme později.

Informace ohledně hlavní třídy Qt projektu pro C++ v Qt Creator - Qt - Okenní/formulářové aplikace v C++

Nyní již máme základní okenní projekt vytvořený:

Základní okenní projekt v Qt a C++ - Qt - Okenní/formulářové aplikace v C++

Dostali jsme tři základní soubory (tyto soubory jsou již vytvořeny QtCreatorem a v následujícím textu si je trochu vysvětlíme):

  • main.cpp - hlavní spustitelnou část programu,
  • mainwindow.h - deklaraci pro okno (tento soubor otevřete ze složky headers/ v průzkumníku souborů v levé části okna),
  • mainwindow.cpp - a posledním souborem je samotná implementace okna.

Soubor main.cpp

Náš soubor main.cpp vypadá takto:

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

Vidíme vytvoření nové instance třídy MainWindow, reprezentující hlavní okno. To je následně i zobrazeno pomocí metody show().

Naimportováním QApplication si zajistíme možnost použít smyčku událostí, která je pro okno celkem potřebná - jinak by okno nešlo ani zavřít.

mainwindow.h

Rozkliknutím složky headers/ v průzkumníku souborů vlevo a otevřením souboru mainwindow.h se přesuneme do hlavičkového souboru třídy okna. Opět se na něj jen podíváme a vysvětlíme:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

Zde stojí za zmínku hlavičkový soubor QMainWindow. Jedná se o třídu, která reprezentuje skutečné aplikační okno. Může obsahovat panel nástrojů, menu, tooltips a jiné zajímavosti.

Celkem důležité je makro Q_OBJECT. K rozjezdu však bude stačit informace, že nám umožní používat signály a sloty. Později poznáme, že je to velmi silný nástroj pro předávání informací v aplikaci.

Jinak zde máme jen konstruktor a destruktor (Destruktor bude časem užitečný. Qt5 má sice svou správu paměti, ale osobně ji příliš nedůvěřuji. Prostě "céčko" vyžaduje dávat si pozor na to, jak paměť alokujeme a jak ji uvolňujeme. Tedy vše, co vytvoříme pomocí new, musíme i sami smazat operátorem delete).

mainwindow.cpp

Můžeme se podívat i do souboru mainwindow.cpp:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
}

MainWindow::~MainWindow()
{

}

Zde se toho moc dít nebude. Prostě jen prázdný konstruktor a destruktor. Nyní již jen přeložit a spustit. Ve výsledku dostaneme asi takovéto okno:

První okno v Qt frameworku pro C++ - Qt - Okenní/formulářové aplikace v C++

Titulek a velikost okna

Jak je vidět, okénko je zcela jednoduché a malé, že by se do něj ani žádný obsah nevešel. Navíc má jméno podle názvu projektu. Pojďme to změnit, bude to snadné.

Pro změnu velikosti a titulku okna použijeme dvě metody z třídy QWidget, od níž je QMainWindow zděděné. Jsou to metody resize() pro změnu velikosti a setWindowTitle() pro změnu titulku.

Konstruktor v souboru mainwindow.cpp si upravíme takto:

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(640,480);
    setWindowTitle("Můj první program");
}

A výsledek je hned znát :)

Změna titulku a velikosti okna Qt aplikace v C++ - Qt - Okenní/formulářové aplikace v C++

Kontextová nápověda - Tooltip

Může se stát, že uživatel je poněkud zmaten a neví co má kde napsat nebo stisknout. Proto mu můžeme poskytnout velmi rychlou pomoc při najetí myší na část okna, editační pole nebo např. tlačítko. Všechny výše jmenované součásti jsou odvozeny od třídy QWidget, stejně jako hlavní okno, a tato třída obsahuje metodu setToolTip() a dokonce nám umožní nastavit dobu, po kterou bude nápověda zobrazena pomocí setToolTipDuration().

Vyzkoušejme si tedy tooltip a do konstruktoru přidáme řádek:

setToolTip("Toto okno nic nedělá");

Aplikaci si můžete zkusit spustit znovu a nechat myš chvíli bez pohybu na okně, aby se tooltip zobrazil.

Suroviny aneb resources - Ikona

Říká se, že každý pořádný program by měl mít svou ikonu, tak proč bychom to my měli jinak ? :-) Jenže to bude trošičku složitější problém.

Předně si kdekoli vytvořte adresář (nejlépe ve složce projektu), kde budete mít potřebné obrázky, data a další zdroje... Já používám názvy res/img/, res/data/, res/files/ a podobné. Opravdu je zcela jedno, kde adresář bude. Pokud chcete sdílet stejná data mezi programy, stačí jeden univerzální adresář. Ovšem QtCreator bude stejně chtít data kopírovat do projektového adresáře.

Pokud bych dělal stejný program v Pythonu s PyQt nebo PySide, přistupoval bych k datům přímo zadáním cesty, ale v C++ existuje zajímavější postup a to soubor *.qrc.

Praxe dělá mistry. Tedy pravým tlačítkem myši klikneme na projektové soubory, přesněji na první položku názvu projektu nebo na nějaký projektový adresář:

Přidání souboru k Qt projektu pro C++ - Qt - Okenní/formulářové aplikace v C++

Z nabídky zvolíme přidat nový a v dialogu si vybereme Qt a Qt Resource file:

Nový Qt Resource File - Qt - Okenní/formulářové aplikace v C++

Souboru dáme vhodný název, např. resource:

Soubor resource v Qt Creator - Qt - Okenní/formulářové aplikace v C++

A pak už jen dokončit. Vznikne nám cosi takového:

Resources v Qt Creator - Qt - Okenní/formulářové aplikace v C++

Dále klikneme na Přidat -> Přidat předponu a výchozí předponu /new/prefix1 změníme na img. Pak znovu klikneme na Přidat, ale tentokrát přidáme soubor s ikonou. Zde již jedna předpřipravená je.

Doporučuji pro hlavní ikonu rozměry aspoň 64x64 až 512x512px a pro ostatní stačí 16x16 až 64x64px. Hodí se pak i pro dialog O programu (about) a všude jinde bude zmenšena na potřebnou velikost. Také nejlepší formát je png s průhledností. Ostatně všechny obrázky pro panel nástrojů i menu by měly být ve formátu png a průhledné. Jpg, Ico, Tiff atd raději nepoužívejte

Na obrázku níže máte jednu pokusnou ikonu připravenou a můžete ji klidně použít.

Qt ikona - Qt - Okenní/formulářové aplikace v C++

Poté si své ikoně dejte pracovní název - alias. Nad dialogem správy zdrojů je strom souborů. Stačí kliknout na název a dole alias napsat. Sám jsem použil mainIcon.

Nyní již je třeba jen přidat jeden příkaz do konstruktoru okna a máme okno i s ikonou:

setWindowIcon(QIcon(":/img/mainIcon"));

Zde stojí za pozornost další třída: QIcon a hlavně text argumentu. Předně dvojtečka označuje, že soubor se bere z qrc a navíc jako pracovní název - alias. Jméno jsme si určili sami, tedy mainIcon.

Výsledek okna vám nyní neukážu, protože v Linuxu mám okna bez ikon, ale aspoň takto:

Ikona Qt programu - Qt - Okenní/formulářové aplikace v C++

Tak a zde je celý dnešní soubor mainwindow.cpp:

#include "mainwindow.h"

#include <QIcon>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    resize(640,480);
    setWindowTitle("Můj první program");
    setToolTip("Tohle okno nic nedělá");
    setWindowIcon(QIcon(":/img/mainIcon"));
}

MainWindow::~MainWindow()
{

}

To je pro dnešní lekci vše.

Příště, v lekci Dokončení prvního okna v Qt a C++ - Tlačítko, se podíváme na nějaké to tlačítko a takovou vyšší dívčí jako jsou signály a jejich sloty pro zpracovaní přenosu dat mezi jednotlivými widgety či chce-li komponentami uživatelského rozhraní.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 71x (81.78 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

Předchozí článek
Instalace Qt frameworku pro C++
Všechny články v sekci
Qt - Okenní/formulářové aplikace v C++
Přeskočit článek
(nedoporučujeme)
Dokončení prvního okna v Qt a C++ - Tlačítko
Článek pro vás napsal Virlupus
Avatar
Uživatelské hodnocení:
22 hlasů
Autor se věnuje webovým aplikacím, skladově-účetnímu softwaru, 3D grafice, lexiální analýze a parserování. Studuje fyziku na MFF UK. Učil IT na střední škole.
Aktivity