<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IT blog &#187; Qt</title>
	<atom:link href="http://szj.cz/tag/qt/feed/" rel="self" type="application/rss+xml" />
	<link>http://szj.cz</link>
	<description>internet, linux, novinky, programování</description>
	<lastBuildDate>Sat, 12 Sep 2015 11:14:32 +0000</lastBuildDate>
	<language>cs-CZ</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.2.2</generator>
	<item>
		<title>Qt  &#8211; tabulka</title>
		<link>http://szj.cz/qt-tabulka/</link>
		<comments>http://szj.cz/qt-tabulka/#comments</comments>
		<pubDate>Fri, 16 Mar 2012 10:00:05 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[tabulka]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=223</guid>
		<description><![CDATA[Pakliže potřebujete v programu prezentovat více údajů podobného charakteru, hodí se skvěle ke splnění takového úkolu běžná tabulka. V případě přehledně navržené struktury představuje jen obtížně porazitelného pomocníka pro rychlé seznámení s daty. Právě proto v tomto článku vytvoříme aplikaci, jenž umožní zadat větší počet těch nejzákladnějších osobních údajů (jméno a příjmení). Protože však samotné [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pakliže potřebujete v programu prezentovat více údajů podobného charakteru, hodí se skvěle ke splnění takového úkolu běžná tabulka. V případě přehledně navržené struktury představuje jen obtížně porazitelného pomocníka pro rychlé seznámení s daty. Právě proto v tomto článku vytvoříme aplikaci, jenž umožní zadat větší počet těch nejzákladnějších osobních údajů (jméno a příjmení). Protože však samotné přidávání informací do tabulky bez následujícího zpracování příliš smysl nemá, bude i názorně demonstrováno jak k jednotlivým buňkám v kódu přistoupit a využít jejich obsah.</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/03/qt-tabulka.png"><img class="aligncenter size-full wp-image-225" title="qt-tabulka" src="http://szj.cz/wp-content/uploads/2012/03/qt-tabulka.png" alt="Qt - tabulka" width="417" height="303" /></a></p>
<h2>QTableWidget</h2>
<p>Pokud si do vyhledávacího pole v návrhářském režimu zadáte termín &#8222;table&#8220;, zjistíte, že takové podmínce odpovídají hned dva prvky – Table View a Table Widget. V našem programu využijeme ten druhý jmenovaný. Důvodem je především způsob zpracování metod třídy <strong>QTableWidget</strong>. Do karet dále nahrává množství funkcí oproti <strong>QTableView</strong>.</p>
<p>Důležitou součást každé správné tabulky symbolizuje horní hlavička. Právě ona totiž dává samotným údajům smysl. O její nastavení se postará <strong>setHorizontalHeaderLabels(QStringList)</strong>. V parametru však vyžaduje list typu QstringList. Právě proto jej nejprve musíme vytvořit a vložit do něj přes append samotné popisky. Během programování rovněž nezapomeňte určit počet sloupců naší tabulky. Krásně k tomuto účelu poslouží počet prvků v listu.</p>
<p>Přidání řádku probíhá obdobně. Jednoduše jej vložíte za aktuální poslední záznam díky metodě <strong>insertRow(int)</strong>. Množství používaných řádků vám přitom prozradí <strong>rowCount().</strong></p>
<h2>Zpracování informací</h2>
<p>K procházení veškerých buněk v tabulce využijeme iterační cyklus, jehož proměnná bude reprezentovat daný řádek. Specifikaci sloupce poté můžeme provést staticky s pomocí proměnné typu int. Obsah buňky následně vrátí metoda <strong>item(int, int)</strong> avšak jako <strong>QtableWidgetItem *</strong>. Kýžený QString poté zprostředkuje <strong>text()</strong>.</p>
<p>#include &#8222;widget.h&#8220;<br />
#include &#8222;ui_widget.h&#8220;</p>
<p>#include <QMessageBox></p>
<p>widget::widget(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::widget)<br />
{<br />
    ui->setupUi(this);</p>
<p>    QStringList list;<br />
    list.append(&#8222;Jméno&#8220;);<br />
    list.append(&#8222;Příjmení&#8220;);<br />
    ui->tableWidget->setColumnCount(list.size());<br />
    ui->tableWidget->setHorizontalHeaderLabels(list);</p>
<p>    setWindowTitle(&#8222;Tabulka&#8220;);</p>
<p>    connect(ui->pb_info,SIGNAL(clicked()),this,SLOT(vypsat_info()));<br />
    connect(ui->pb_pridat,SIGNAL(clicked()),this,SLOT(pridat_radek()));<br />
}</p>
<p>widget::~widget()<br />
{<br />
    delete ui;<br />
}</p>
<p>void widget::pridat_radek()<br />
{<br />
    ui->tableWidget->insertRow(ui->tableWidget->rowCount());<br />
}</p>
<p>void widget::vypsat_info()<br />
{<br />
    for(int i = 0; i < ui->tableWidget->rowCount();i++)<br />
    {<br />
        QMessageBox::information(this,QString::number(i+1)+&#8220;. řádek&#8220;,&#8220;Jméno: &#8222;+<br />
                                 ui->tableWidget->item(i,0)->text()+&#8220;\n&#8220;+<br />
                                 &#8222;Příjmení: &#8222;+<br />
                                 ui->tableWidget->item(i,1)->text()<br />
                                 );<br />
    }<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-tabulka/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – propojování signálů a slotů</title>
		<link>http://szj.cz/qt-%e2%80%93-propojovani-signalu-a-slotu/</link>
		<comments>http://szj.cz/qt-%e2%80%93-propojovani-signalu-a-slotu/#comments</comments>
		<pubDate>Thu, 08 Mar 2012 17:17:00 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[signál]]></category>
		<category><![CDATA[slot]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=217</guid>
		<description><![CDATA[Tento článek bude sice laděn poněkud obecněji, stoprocentně však nabyté informace využijete. A nebo si snad dokážete představit komplexnější okenní program, který by fungoval bez vzájemného propojení signálů a slotů? Jakmile se ve vašem programu objeví jediné tlačítko, položka v menu či jiný libovolný prvek, vždy musíte určit, jaká činnost se po jeho aktivaci nebo [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Tento článek bude sice laděn poněkud obecněji, stoprocentně však nabyté informace využijete. A nebo si snad dokážete představit komplexnější okenní program, který by fungoval bez vzájemného propojení signálů a slotů? Jakmile se ve vašem programu objeví jediné tlačítko, položka v menu či jiný libovolný prvek, vždy musíte určit, jaká činnost se po jeho aktivaci nebo stisknutí provede. Tuto specifikaci lze přitom provést několika rozdílnými způsoby.</p>
<h2>Grafické propojení</h2>
<p>Tuto formu sjednocení signálů a slotů zmíním jen okrajově, protože dle mého názoru dokáže spíše práci znesnadnit. Jedinou možnou výhodu vidím ve znázornění principu odesílání zpráv a jejich zachytávání. Začátečník tak celou ideu patrně lépe pochopí. Vyzkoušet si tuto variantu můžete v návrhářském režimu po stisknutí F4, kdy tažením myši určíte zdroj signálu a příslušný cíl. Záhy však pravděpodobně přijdete o přehlednost a snadnou editaci.</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/03/graficke-propojeni.png"><img class="aligncenter size-full wp-image-218" title="graficke-propojeni" src="http://szj.cz/wp-content/uploads/2012/03/graficke-propojeni.png" alt="Grafické propojení" width="474" height="211" /></a></p>
<h2>Signals &amp; Slots Editor</h2>
<p>Velmi sofistikovaný nástroj se skrývá rovněž v designérském módu pod příslušnou záložkou. Zeleným tlačítkem plus zahájíte vytvoření nového spojení. Na určitou nevýhodu však brzy narazíte. Pakliže například naprogramujete vlastní slot, neobjeví se v rozevíracím seznamu. Nejprve jej s pomocí funkce Change signals/slot musíte do příslušné části ručně vepsat. Když si však přesně nepamatujete identifikátor, nezbývá, než se přepnout do zdrojového kódu a dotyčný název vyhledat. Já osobně například chvílemi přemýšlím, zda-li jsem slot pojmenoval jako uloz, ulozit či snad Ulozit :-).</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/03/editor.png"><img class="aligncenter size-full wp-image-219" title="editor" src="http://szj.cz/wp-content/uploads/2012/03/editor.png" alt="Editor signálů a slotů" width="408" height="146" /></a></p>
<h2>Connect</h2>
<p>Syntaxe určení závislosti mezi signálem a koncovým cílem zapsaná ve zdrojovém kódu patrně na první pohled nevypadá pro lidi začínající s Qt příliš lákavě. Nejde však o nic složitého a velmi záhy si na funkci connect dokážete zvyknout. Obvykle se stačí dobře seznámit s makry SIGNAL() a SLOT(). Editor vám navíc vždy ochotně napoví.</p>
<p>connect(ui->pb_barva,SIGNAL(clicked()),this,SLOT(barva()));</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-propojovani-signalu-a-slotu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – získání barvy a náhodného čísla</title>
		<link>http://szj.cz/qt-%e2%80%93-ziskani-barvy-a-nahodneho-cisla/</link>
		<comments>http://szj.cz/qt-%e2%80%93-ziskani-barvy-a-nahodneho-cisla/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 15:21:06 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[barva]]></category>
		<category><![CDATA[barvy]]></category>
		<category><![CDATA[náhodné číslo]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=199</guid>
		<description><![CDATA[Následující tutoriál se bude věnovat rovnou dvěma zajímavým oblastem, které v praxi rozhodně využijete. Dozvíte se, jakým způsobem lze uživatele vyzvat k pohodlnému výběru barvy a naučíte se postup umožňující získání náhodného čísla. Pakliže chcete vytvořit program, který se nebude chovat vždy stejně a zachová si určitý nádech &#34;tajemna&#34;, dozajista se vám využívání nahodilých číselných [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Následující tutoriál se bude věnovat rovnou dvěma zajímavým oblastem, které v praxi rozhodně využijete. Dozvíte se, jakým způsobem lze uživatele vyzvat k pohodlnému výběru barvy a naučíte se postup umožňující získání náhodného čísla. Pakliže chcete vytvořit program, který se nebude chovat vždy stejně a zachová si určitý nádech &quot;tajemna&quot;, dozajista se vám využívání nahodilých číselných proměnných zalíbí. Našim cílem tentokrát bude naprogramovat aplikaci, jenž po výběru barvy změní fádní bílé pozadí <strong>plainTextEditu</strong>. Lidem přitom s výběrem barvy poněkud pomůžeme, protože náhodně doporučíme jedno ze třech předem definovaných zabarvení.</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/02/qt-barva-1.png"><img class="aligncenter size-full wp-image-200" title="qt-barva-1" src="http://szj.cz/wp-content/uploads/2012/02/qt-barva-1.png" alt="Qt - získání barvy - krok 1" width="462" height="233" /></a></p>
<p><a href="http://szj.cz/wp-content/uploads/2012/02/qt-barva-2.png"><img class="aligncenter size-full wp-image-202" title="qt-barva-2" src="http://szj.cz/wp-content/uploads/2012/02/qt-barva-2.png" alt="Qt - získání barvy - krok 2" width="575" height="427" /></a></p>
<p><a href="http://szj.cz/wp-content/uploads/2012/02/qt-barva-3.png"><img class="aligncenter size-full wp-image-204" title="qt-barva-3" src="http://szj.cz/wp-content/uploads/2012/02/qt-barva-3.png" alt="Qt - získání barvy - krok 3" width="462" height="233" /></a></p>
<h2>QColorDialog</h2>
<p>Dialog sloužící ke komfortnímu zvolení barvy není třeba od základu vytvářet. Plně postačí využít ten systémový. S tím nám pomůže knihovna <strong>QColorDialog</strong>. Jako parametr <strong>getColor</strong> přitom uvádíme náhodně zvolenou barvu, kterou přiřazuje do proměnné<strong>switch.</strong> Jako výsledek přitom obdržíte platný <strong>QColor</strong> jen v případě, že uživatel dialogové okno nezruší s pomocí <strong>Cancel</strong>. Toho lze krásně využít v podmínce, která tuto skutečnost testuje. O celou verifikaci se postará metoda <strong>isValid()</strong>. Samotná proměnná typu <strong>QColor</strong> však k nastavení pozadí nestačí. <strong>PlainTextEdit</strong> totiž nic podobného jako <strong>setColor(QColor)</strong> nezná. Musí proto dojít ke zrodu palety (<strong>QPalette</strong>), která v sobě obsahuje různé barvy jednoho objektu a identifikuje je díky <strong>ColorRole</strong> (v našem případě <strong>Qpalette::Base</strong>). Nově vzniklou paletu poté již stačí <strong>plainTextEditu</strong> nastavit s pomocí <strong>setPalette(QPalette)</strong>. V konstruktoru si přitom povšimněte nastavení vlastnosti <strong>autoFillBackgroung</strong> na <strong>true</strong>, což zajistí vyplnění pozadí.</p>
<h2>Náhodná čísla</h2>
<p>Před samotným generováním musíme provést inicializaci. Funkce <strong>qsrand</strong> potřebuje údaj, který se bude měnit s každým spuštěním programu. Tuto záležitost elegantně řeší počet vteřin do půlnoci. Modulo za <strong>qrand</strong> určuje rozsah. Interval v našem případě začíná nulou a končí dvojkou. V podstatě tak dochází k náhodnému opakování tří čísel – 0, 1 a 2.</p>
<p>#include &#8222;widget.h&#8220;<br />
#include &#8222;ui_widget.h&#8220;</p>
<p>#include <QColorDialog><br />
#include <QTime></p>
<p>Widget::Widget(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::Widget)<br />
{<br />
    ui->setupUi(this);</p>
<p>    ui->plainTextEdit->setAutoFillBackground(true);<br />
    this->setWindowTitle(&#8222;Barva&#8220;);</p>
<p>    connect(ui->pb_konec,SIGNAL(clicked()),this,SLOT(close()));<br />
    connect(ui->pb_barva,SIGNAL(clicked()),this,SLOT(barva()));</p>
<p>}</p>
<p>Widget::~Widget()<br />
{<br />
    delete ui;<br />
}</p>
<p>void Widget::barva()<br />
{<br />
    QColor prednastavena;<br />
    QTime pulnoc(0,0,0,0);<br />
    qsrand(pulnoc.secsTo(QTime::currentTime()));<br />
    int nahodna = qrand() % 3;</p>
<p>    switch (nahodna){<br />
    case 0:<br />
        prednastavena = Qt::black;<br />
    break;</p>
<p>    case 1:<br />
        prednastavena = Qt::red;<br />
    break;</p>
<p>    case 2:<br />
        prednastavena = Qt::blue;<br />
    break;</p>
<p>    }</p>
<p>    QColor barva = QColorDialog::getColor(prednastavena);</p>
<p>    if(barva.isValid() == true)<br />
    {<br />
      QPalette paleta;<br />
      paleta.setColor(QPalette::Base,barva);<br />
      ui->plainTextEdit->setPalette(paleta);<br />
    }<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-ziskani-barvy-a-nahodneho-cisla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – čtení ze souboru</title>
		<link>http://szj.cz/qt-%e2%80%93-cteni-ze-souboru/</link>
		<comments>http://szj.cz/qt-%e2%80%93-cteni-ze-souboru/#comments</comments>
		<pubDate>Fri, 10 Feb 2012 10:09:10 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[načtení souboru]]></category>
		<category><![CDATA[soubor]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=168</guid>
		<description><![CDATA[V jednom z dalších tutoriálů týkajících se zaměříme na získání dat uložených ve formě textu a následné zobrazení v okně. Nejprve uživatele vyzveme k výběru požadovaného souboru, díky čemuž získáme potřebou cestu. Následně informace lehce poupravíme a výsledek budeme prezentovat s pomocí prvku textEdit. Zpracování údajů po řádcích Záměrně jsem se rozhodl nenačíst celý soubor [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>V jednom z dalších tutoriálů týkajících se zaměříme na získání dat uložených ve formě textu a následné zobrazení v okně. Nejprve uživatele vyzveme k výběru požadovaného souboru, díky čemuž získáme potřebou cestu. Následně informace lehce poupravíme a výsledek budeme prezentovat s pomocí prvku <strong>textEdit</strong>.</p>
<p><a href="http://szj.cz/wp-content/uploads/2012/02/qt-nacteny-soubor.png"><img class="aligncenter size-full wp-image-170" title="qt-nacteny-soubor" src="http://szj.cz/wp-content/uploads/2012/02/qt-nacteny-soubor.png" alt="Qt - načtený soubor" width="406" height="331" /></a></p>
<h2>Zpracování údajů po řádcích</h2>
<p>Záměrně jsem se rozhodl nenačíst celý soubor najednou, ale postupovat po částech. Získáme tak jednotlivé řádky, se kterými můžeme dále pohodlně pracovat. Pakliže by například soubor obsahoval čísla, musíme vždy každý údaj nejprve převést, aby jej šlo uchovat v proměnné typu <strong>int</strong> či <strong>double</strong>. V našem případě však vyzkoušíme něco jiného. Jednotlivé záznamy obalíme tagem <strong>H3</strong> a výsledek <strong>textEdit</strong> dostane v HTML formě. Zcela jednoduše lze proto s textem provádět mnoho činností – změnu barvy, transformaci v tučný záznam a podobné úpravy.</p>
<p>#include &#8222;mainwindow.h&#8220;<br />
#include &#8222;ui_mainwindow.h&#8220;</p>
<p>#include <QFileDialog><br />
#include <QFile><br />
#include <QTextStream><br />
#include <QMessageBox></p>
<p>MainWindow::MainWindow(QWidget *parent) :<br />
    QMainWindow(parent),<br />
    ui(new Ui::MainWindow)<br />
{<br />
    ui->setupUi(this);</p>
<p>    setCentralWidget(ui->textEdit);</p>
<p>    setWindowTitle(&#8222;Načtení souboru&#8220;);</p>
<p>    connect(ui->action_Nacist_soubor,SIGNAL(triggered()),this,SLOT(nacti_soubor()));<br />
    connect(ui->action_Konec,SIGNAL(triggered()),this,SLOT(close()));<br />
}</p>
<p>MainWindow::~MainWindow()<br />
{<br />
    delete ui;<br />
}</p>
<p>void MainWindow::nacti_soubor()<br />
{<br />
    QString cesta = QFileDialog::getOpenFileName(this,&#8220;Zvolte soubor&#8220;,&#8220;/home&#8220;,&#8220;Textový soubor (*.txt);;Všechny soubory(*.*)&#8220;);</p>
<p>    if(cesta.isNull())<br />
    {<br />
        QMessageBox::warning(this,&#8220;Varování&#8220;,&#8220;Nebyl vybrán žádný soubor k načtení&#8220;);<br />
    }<br />
    else<br />
    {<br />
        QFile soubor(cesta);<br />
        soubor.open(QIODevice::ReadOnly | QIODevice::Text);</p>
<p>        QTextStream stream(&#038;soubor);<br />
        stream.setCodec(&#8222;utf-8&#8243;);<br />
        QString radek,vysledek;</p>
<p>        while(!stream.atEnd())<br />
        {<br />
            radek = soubor.readLine();<br />
            //V proměné radek máme načtená řádek ze souboru a můžeme s ním provádět další operace<br />
            vysledek += &#8222;<br />
<h3 style=\"color:#FF0000;\">&#8222;+radek+&#8220;</h3>
<p>\n&#8220;;</p>
<p>        }<br />
        ui->textEdit->insertHtml(vysledek);<br />
    }<br />
}</p>
<p>Rád bych upozornil na fakt, že okno sloužící k výběru souboru můžeme vyšperkovat k představám programátora. Dozajista využijete specifikování typů povolených koncovek. Činí se tak v jednom z parametrů a to díky stringovému řetězci. Jednotlivé akceptovatelné varianty odděluje dvojice středníků. Dále určujeme i výchozí složku. Protože požívám Linux, vidíte ve zdrojovém kódu /home. Lidé preferující operační systém Windows mohou směle uvést např. C:\data.</p>
<p>Pozor na jednu skutečnost. Uživatel má možnost dialog zjišťující cestu kdykoliv ukončit a my poté pochopitelně nemůžeme žádný soubor načíst. Ošetření vyřeší jednoduchá podmínka testující, zda proměnná <strong>cesta</strong> obsahuje daný řetězec. Pakliže ano, vše je v pořádku a můžeme programu dovolit vykonat činnost, ke které ho vytváříme. V opačném případě raději vypíšeme hlášku a uživateli pochopitelně umožníme se o zvolení cesty pokusit kdykoliv později.</p>
<p>Povšimněte si, že po otevření samotného souboru využijeme knihovnu QTextStream, které předáme parametr typu QFile. Jakmile tak provedeme, můžeme s daty velmi pohodlně zacházet. Začnou-li vás trápit problémy s diakritikou, zkontrolujte, zda máte správně nastaveno kódování.</p>
<p>Díky cyklu s podmínkou na začátku zajistíme obdržení samotných řádků. Ty poté ukládáme do koncové proměnné výsledek. Ještě než se tak stane, však přidáme slíbený párový tag <strong>H3</strong>. Ten navíc obohacuje vlastnost style udávající barvu písma. Metoda insertHtml pak již na závěr celé dílo sama dokoná.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-cteni-ze-souboru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – Combo box</title>
		<link>http://szj.cz/qt-%e2%80%93-combo-box/</link>
		<comments>http://szj.cz/qt-%e2%80%93-combo-box/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 10:00:27 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[Combo box]]></category>
		<category><![CDATA[Label]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=124</guid>
		<description><![CDATA[Na následujícím příkladě si společně ukážeme práci s combo boxem. Konkrétně budeme využívat rovnou dva ovládací prvky tohoto typu, které na sobě dokonce budou závislé. Změna volby uživatelem se proto okamžitě projeví v obsahu druhého combo boxu. Pokud nastavíme vlastnost editable na true, získáme možnost vkládat vlastní hodnoty. V našem programu však povolíme výběr pouze [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Na následujícím příkladě si společně ukážeme práci s <strong>combo boxem</strong>. Konkrétně budeme využívat rovnou dva ovládací prvky tohoto typu, které na sobě dokonce budou závislé. Změna volby uživatelem se proto okamžitě projeví v obsahu druhého <strong>combo boxu</strong>. Pokud nastavíme vlastnost <strong>editable</strong> na <strong>true</strong>, získáme možnost vkládat vlastní hodnoty. V našem programu však povolíme výběr pouze z předem definovaných údajů. Nejprve se aplikace zeptá, zda-li budeme cestovat <strong>po zemi</strong> nebo <strong>ve vzduchu</strong>. Na základě odpovědi poté upraví druhý <strong>combo box</strong> a nabídne odpovídající dopravní prostředky.</p>
<p><a href="http://szj.cz/wp-content/uploads/2011/12/combobox.png"><img class="aligncenter size-full wp-image-125" title="combobox" src="http://szj.cz/wp-content/uploads/2011/12/combobox.png" alt="Combo box" width="437" height="297" /></a></p>
<h2>Designérský režim</h2>
<p>Po vytvoření projektu se přepneme do módu <strong>design</strong>. Postupně přidáme oba <strong>combo boxy</strong> a několik <strong>Labelů</strong>. Nezapomeňte si jednotlivé objekty vhodně pojmenovat, díky čemuž si usnadníte následující programování.</p>
<h3>Tvorba zdrojového kódu</h3>
<p>Mezi pro nás nejdůležitější funkci <strong>combo boxu</strong> patří <strong>addItem</strong>. V konstruktoru třídy si s její pomocí naplníme ovládací prvek. Položky se přidávají vždy za poslední volbu a disponují rovněž vlastním interním <strong>id</strong>, které se počítá od nuly. To ostatně vysvětluje, proč jsem vytvořil i pomocnou funkci <strong>procistit</strong>. Původně přitom její tělo obsahovalo iterační cyklus, včas mě však zarazila hodnota vrácená s pomocí <strong>count</strong>. Ta totiž prozrazuje celkový počet záznamů a nikoliv nejvyšší <strong>id</strong>. Tuto hodnotu si musíme sami dopočítat, tedy odečíst jedničku. <strong>Procistit</strong> musíme zavolat po každé změně výběru, protože v opačném případě by se druhý <strong>combo box</strong> postupně rozrůstal o duplicitní informace. Spojení signálů a slotů pochopitelně naleznete opět v konstruktoru. Volají se v podstatě jen dvě funkce – <strong>zmena</strong> a <strong>souhrn</strong>. Ta první se postará o obměnu příslušného <strong>combo boxu</strong>. Druhá nám sestaví informační <strong>QString</strong>, který poté nastaví vlastnosti <strong>text</strong> u <strong>Labelu</strong> umístěného ve spodní části okna. Povšimněte si rovněž, že se plně obejdeme bez tlačítek. Veškeré úpravy probíhají ihned poté, co uživatel změní svůj názor.</p>
<p>#include &#8222;widget.h&#8220;<br />
#include &#8222;ui_widget.h&#8220;</p>
<p>Widget::Widget(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::Widget)<br />
{<br />
    ui->setupUi(this);</p>
<p>    ui->cb_typCesty->addItem(&#8222;Po zemi&#8220;);<br />
    ui->cb_typCesty->addItem(&#8222;Ve vzduchu&#8220;);</p>
<p>    connect(ui->cb_typCesty,SIGNAL(activated(int)),this,SLOT(zmena(int)));<br />
    connect(ui->cb_typCesty,SIGNAL(activated(int)),this,SLOT(souhrn()));<br />
    connect(ui->cb_dopravniProstredek,SIGNAL(activated(int)),this,SLOT(souhrn()));<br />
    zmena(ZEME);<br />
    souhrn();</p>
<p>}</p>
<p>Widget::~Widget()<br />
{<br />
    delete ui;<br />
}</p>
<p>void Widget::zmena(int id){<br />
    procistit(ui->cb_dopravniProstredek);</p>
<p>  if (id == ZEME){<br />
      ui->cb_dopravniProstredek->addItem(&#8222;Automobil&#8220;);<br />
      ui->cb_dopravniProstredek->addItem(&#8222;Motocykl&#8220;);<br />
  }else if (id == VZDUCH){<br />
      ui->cb_dopravniProstredek->addItem(&#8222;Letadlo&#8220;);<br />
      ui->cb_dopravniProstredek->addItem(&#8222;Helikoptéra&#8220;);<br />
      }<br />
}</p>
<p>void Widget::procistit(QComboBox*&#038; obj){<br />
    while(obj->count() != 0){<br />
     obj->removeItem(obj->count()-1);<br />
    }</p>
<p>}</p>
<p>void Widget::souhrn(){<br />
QString typ = ui->cb_typCesty->itemText(ui->cb_typCesty->currentIndex());<br />
QString prostredek = ui->cb_dopravniProstredek->itemText(ui->cb_dopravniProstredek->currentIndex());<br />
QString vysledek = &#8222;Typ cesty: &#8222;+ typ +&#8220;. Dopravní prostředek: &#8220; + prostredek;<br />
ui->l_vysledek->setText(vysledek);<br />
}</p>
<p>&nbsp;</p>
<h3>Enum</h3>
<p>Závěrem ještě poukáži na <strong>výčtový</strong> <strong>typ</strong> pojmenovaný překvapivě jako <strong>TYP</strong>. Konstanta <strong>ZEME</strong> zastupuje číselnou hodnotu <strong>0</strong>, zatímco <strong>VZDUCH</strong> symbolizuje <strong>1.</strong> Zdrojový kód díky tomu získává na přehlednosti.</p>
<p>#ifndef WIDGET_H<br />
#define WIDGET_H</p>
<p>#include <QWidget><br />
#include <QButtonGroup></p>
<p>#include <QComboBox></p>
<p>enum TYP{ZEME,VZDUCH};</p>
<p>namespace Ui {<br />
    class Widget;<br />
}</p>
<p>class Widget : public QWidget<br />
{<br />
    Q_OBJECT</p>
<p>public:<br />
    explicit Widget(QWidget *parent = 0);<br />
    ~Widget();</p>
<p>public slots:<br />
    void zmena(int);<br />
    void souhrn();</p>
<p>private:<br />
    Ui::Widget *ui;<br />
    void procistit(QComboBox*&#038; obj);<br />
};</p>
<p>#endif // WIDGET_H</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-combo-box/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – menu</title>
		<link>http://szj.cz/qt-%e2%80%93-menu/</link>
		<comments>http://szj.cz/qt-%e2%80%93-menu/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 00:00:55 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[menu]]></category>
		<category><![CDATA[programování]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=106</guid>
		<description><![CDATA[Následující aplikace patří mezi ty jednodušší, dokáže totiž pouze sečíst dvě celá čísla. Mnohem zajímavější však je způsob ovládání. Naučíme se vytvořit klasické menu včetně toolbaru. Práce v designérském režimu Při zakládání nového projektu nezapomeňte, že tentokrát budeme vycházet z třídy QMainWindow. Po otevření vzhledu okna začneme s přidáním dvou prvků line edit a několika [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Následující aplikace patří mezi ty jednodušší, dokáže totiž pouze sečíst dvě celá čísla. Mnohem zajímavější však je způsob ovládání. Naučíme se vytvořit klasické menu včetně <strong>toolbaru</strong>.</p>
<h2>Práce v designérském režimu</h2>
<p>Při zakládání nového projektu nezapomeňte, že tentokrát budeme vycházet z třídy <strong>QMainWindow</strong>. Po otevření vzhledu okna začneme s přidáním dvou prvků <strong>line edit </strong>a několika popisků (<strong>label</strong>). Kompletně vynecháme jakákoliv tlačítka a vrhneme se na ovládací nabídku. Jednoduše vypíšeme názvy jednotlivých položek v menu, které se následně usídlí ve spodní záložce <strong>Action editor</strong>. Po kliknutí na některou z nich se nám otevře okno, ve kterém lze nastavit mnoho užitečných věcí. Konkrétně si ze souboru přidáme vhodnou ikonu. Pokud žádnou nedisponujete, vyzkoušejte tzv. <strong>projekt</strong> <strong>Nuvola</strong>. Jedná se o obsáhlou sadu ikonek v nejpoužívanějších rozměrech uvolněnou pod licencí <strong>LGPL</strong>.</p>
<p><a href="http://szj.cz/wp-content/uploads/2011/11/qt-menu.png"><img class="aligncenter size-full wp-image-107" title="qt-menu" src="http://szj.cz/wp-content/uploads/2011/11/qt-menu.png" alt="Qt - menu" width="367" height="262" /></a></p>
<p><a href="http://szj.cz/wp-content/uploads/2011/11/qt-rozbalene-menu.png"><img class="aligncenter size-full wp-image-108" title="qt-rozbalene-menu" src="http://szj.cz/wp-content/uploads/2011/11/qt-rozbalene-menu.png" alt="Qt - rozbalené menu" width="367" height="262" /></a></p>
<h2>Horké klávesy</h2>
<p>Vždy se vyplácí aplikaci navrhovat takovým způsobem, aby ji bylo možno ovládat bez pomoci kurzoru myši. Stačí před název položky přidat znak <strong>ampersand</strong> (<strong>&amp;</strong>) a následně lze využít následující písmeno při kombinaci s klávesou <strong>ALT</strong> pro získání kontroly nad programem. Vaši práci ocení například majitelé notebooků, kteří nemají po ruce myš a s touchpadem si příliš nerozumí.</p>
<h2>Toolbar</h2>
<p>Jakmile máte veškeré objekty seskupené v <strong>Action Editoru</strong> nastavené dle vašeho přání, přejděte k vytvoření <strong>toolbaru</strong>. Stačí přetáhnout libovolnou položku na požadované místo v <strong>toolbaru</strong>, který se automaticky nachází pod menu. O správném postupu vás okamžitě ubezpečí přidělená ikonka.</p>
<h2>Zdrojový kód</h2>
<p>Další postup již není nijak náročný. Stačí jen získat údaje z obou <strong>line</strong> <strong>editů</strong>, provést součet a výsledek nastavit jako text patřičnému <strong>labelu</strong>. Nezapomeňte rovněž propojit oba <strong>signály</strong>. Povšimněte si obzvláště slotu <strong>close()</strong>, který se postará o hladké ukončení programu. Nezapomeňte rovněž zajistit zobrazení výsledku získaného během průběhu <strong>secti()</strong> po kliknutí na <strong>Sečíst</strong> v menu.</p>
<p>#include &#8222;hlavniokno.h&#8220;<br />
#include &#8222;ui_hlavniokno.h&#8220;<br />
#include <QIntValidator><br />
#include <QString></p>
<p>HlavniOkno::HlavniOkno(QWidget *parent) :<br />
    QMainWindow(parent),<br />
    ui(new Ui::HlavniOkno)<br />
{<br />
    ui->setupUi(this);<br />
    setWindowTitle(&#8222;Menu&#8220;);</p>
<p>    QIntValidator *val;<br />
    val = new QIntValidator(this);</p>
<p>    ui->le_prvni->setValidator(val);<br />
    ui->le_druhe->setValidator(val);</p>
<p>    connect(ui->action_Secist,SIGNAL(triggered()),this,SLOT(secti()));<br />
    connect(ui->action_Konec,SIGNAL(triggered()),this,SLOT(close()));<br />
}</p>
<p>HlavniOkno::~HlavniOkno()<br />
{<br />
    delete ui;<br />
}</p>
<p>void HlavniOkno::secti(){<br />
int prvni,druhe,vysledek;<br />
QString pom;<br />
prvni = ui->le_prvni->text().toInt();<br />
druhe = ui->le_druhe->text().toInt();</p>
<p>vysledek = prvni + druhe;</p>
<p>ui->l_vysledek->setText(pom.setNum(vysledek));</p>
<p>}</p>
<p>&nbsp;</p>
<p>#ifndef HLAVNIOKNO_H<br />
#define HLAVNIOKNO_H</p>
<p>#include <QMainWindow></p>
<p>namespace Ui {<br />
    class HlavniOkno;<br />
}</p>
<p>class HlavniOkno : public QMainWindow<br />
{<br />
    Q_OBJECT</p>
<p>public:<br />
    explicit HlavniOkno(QWidget *parent = 0);<br />
    ~HlavniOkno();</p>
<p>private:<br />
    Ui::HlavniOkno *ui;<br />
public slots:<br />
    void secti();<br />
};</p>
<p>#endif // HLAVNIOKNO_H</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-menu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – checkbox</title>
		<link>http://szj.cz/qt-%e2%80%93-checkbox/</link>
		<comments>http://szj.cz/qt-%e2%80%93-checkbox/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 10:00:44 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[checkbox]]></category>
		<category><![CDATA[Label]]></category>
		<category><![CDATA[radio button]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=70</guid>
		<description><![CDATA[Před praktickou ukázkou práce s checkboxy si nejprve dovolím malé shrnutí rozdílů mezi tímto ovládacím prvkem a radio buttonem. Zatímco u první zmíněné varianty může uživatel zaškrtnout více voleb, v případě té druhé je jeho svoboda značně omezena. Zvolí totiž pouze jen jednu položku. Z tohoto důvodu se práce s oběma prvky poněkud liší. Checkbox [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Před praktickou ukázkou práce s <strong>checkboxy</strong> si nejprve dovolím malé shrnutí rozdílů mezi tímto ovládacím prvkem a <strong>radio buttonem</strong>. Zatímco u první zmíněné varianty může uživatel zaškrtnout více voleb, v případě té druhé je jeho svoboda značně omezena. Zvolí totiž pouze jen jednu položku. Z tohoto důvodu se práce s oběma prvky poněkud liší. <strong>Checkbox</strong> nám totiž pochopitelně vrátí předem nespecifikovaný počet výsledků. Proto se dnes zaměříme právě na tuto oblast zajímavou z programátorského hlediska.</p>
<p>Poměrně dlouho jsem přemýšlel, jaký příklad pro tuto problematiku zvolit. Nakonec došlo ke stvoření jednoduché aplikace, která nás vybízí k výběru několika druhů sýra. Po stisknutí na tlačítko nám následně všechny zvolené potraviny vypíše. Po dalším rozšíření by tento program mohl například využívat kuchař v pizzerii, který si přesně nepamatuje, co si zákazníci vlastně objednali. <img src="http://szj.cz/wp-includes/images/smilies/simple-smile.png" alt=":-)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="http://szj.cz/wp-content/uploads/2011/10/qt-checkbox-pred-zadanim.png"><img class="aligncenter size-full wp-image-72" title="qt-checkbox-pred-zadanim" src="http://szj.cz/wp-content/uploads/2011/10/qt-checkbox-pred-zadanim.png" alt="Qt checkbox - před zadáním" width="435" height="202" /></a></p>
<p><a href="http://szj.cz/wp-content/uploads/2011/10/qt-checkbox-po-zadani.png"><img class="aligncenter size-full wp-image-73" title="qt-checkbox-po-zadani" src="http://szj.cz/wp-content/uploads/2011/10/qt-checkbox-po-zadani.png" alt="Qt checkbox - po zadání" width="435" height="202" /></a></p>
<p>#ifndef WIDGET_H<br />
#define WIDGET_H</p>
<p>#include <QWidget><br />
#include <QButtonGroup></p>
<p>namespace Ui {<br />
    class Widget;<br />
}</p>
<p>class Widget : public QWidget<br />
{<br />
    Q_OBJECT</p>
<p>public:<br />
    explicit Widget(QWidget *parent = 0);<br />
    ~Widget();</p>
<p>private:<br />
    Ui::Widget *ui;<br />
    QButtonGroup *syr_skupina;</p>
<p>public slots:<br />
    void syr();<br />
};</p>
<p>#endif // WIDGET_H</p>
<p>&nbsp;</p>
<p>#include &#8222;widget.h&#8220;<br />
#include &#8222;ui_widget.h&#8220;</p>
<p>Widget::Widget(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::Widget)<br />
{<br />
    ui->setupUi(this);</p>
<p>    syr_skupina = new QButtonGroup(this);<br />
    syr_skupina->addButton(ui->ch_hermelin,1);<br />
    syr_skupina->addButton(ui->ch_eidam,2);<br />
    syr_skupina->addButton(ui->ch_mozzarella,3);<br />
    syr_skupina->setExclusive(false);</p>
<p>}</p>
<p>Widget::~Widget()<br />
{<br />
    delete ui;<br />
}</p>
<p>void Widget::syr(){<br />
    QAbstractButton *vracene;<br />
    QString vysledek = &#8222;Objedávka: \n&#8220;;<br />
    int pocet = 0;</p>
<p>    for(int i = 1; i < 4;i++){<br />
        vracene = syr_skupina->button(i);<br />
        if (vracene->isChecked()){<br />
            vysledek += vracene->text() + &#8222;\n&#8220;;<br />
            pocet++;<br />
            }<br />
        }</p>
<p>    if(pocet == 0){<br />
    vysledek += &#8222;Není vybrán žádný sýr!&#8220;;<br />
    }else{<br />
    vysledek += &#8222;Přejeme dobrou chuť!&#8220;;<br />
    }</p>
<p>    ui->l_vysledek->setText(vysledek);<br />
}</p>
<p>&nbsp;</p>
<h2>Skupina prvků v podání QbuttonGroup</h2>
<p>V návrhářském režimu stačí přidat několik popisných <strong>labelů</strong> a samotné <strong>checkboxy</strong>. Nezapomeňte rovněž na ovládací prvek, ve kterém se zobrazí získaný výsledek. V našem případě se opět jedná o klasický <strong>label. </strong>Zajímavější kroky na nás čekají v <strong>konstruktoru</strong>. Vytvoříme si totiž skupinu prvků tzv. QbuttonGroup a přidáme do ní jednotlivé <strong>checkboxy</strong>. Musíme u nich specifikovat i vlastní <strong>id</strong>, které později budeme potřebovat při procházení v <strong>iteračním cyklu</strong>. S pomocí <strong>setExclusive</strong> dosáhneme toho, že se celá skupina začne chovat dle našich požadavků. Pokud bychom jako <strong>parametr</strong> předali <strong>true</strong>, získáme <strong>checkboxy</strong> fungující jako <strong>radio buttony</strong>.</p>
<h2>Zpracování</h2>
<p>Ve <strong>slotu</strong>, který se spouští po <strong>signálu</strong> <strong>clicked</strong> z tlačítka se provádí samotný výpis. V cyklu si projdeme jednotlivé <strong>checkboxy</strong> a ověříme si, zda je uživatel zaškrtnul. Pokud ano, přidáme jejich popisek (text) do stringové proměnné, kterou nakonec nastavíme s pomocí <strong>setText </strong>výslednému <strong>labelu</strong> v hlavním okně.</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-checkbox/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – signály a sloty</title>
		<link>http://szj.cz/qt-%e2%80%93-signaly-a-sloty/</link>
		<comments>http://szj.cz/qt-%e2%80%93-signaly-a-sloty/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 06:49:56 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[Label]]></category>
		<category><![CDATA[Push Button]]></category>
		<category><![CDATA[signály]]></category>
		<category><![CDATA[sloty]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=48</guid>
		<description><![CDATA[V následujícím tutoriálu vám ukáži jeden ze způsobů, kterým lze vzájemně propojovat prvky přidané v návrhářském (designérském) režimu. Našim cílem bude v tomto případě vytvořit jednoduché okno s jediným tlačítkem (Push Button). Po kliknutí se následně zobrazí text, který byl původně skrytý. Přípravy Nejprve si přidáme do prostoru okna dva potřebné elementy. Jde o již [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>V následujícím tutoriálu vám ukáži jeden ze způsobů, kterým lze vzájemně propojovat prvky přidané v návrhářském (designérském) režimu. Našim cílem bude v tomto případě vytvořit jednoduché okno s jediným tlačítkem (<strong>Push</strong> <strong>Button</strong>). Po kliknutí se následně zobrazí text, který byl původně skrytý.</p>
<h2>Přípravy</h2>
<p>Nejprve si přidáme do prostoru okna dva potřebné elementy. Jde o již zmíněné tlačítko a popisek (<strong>Label</strong>). Nezapomeňte vždy zadat vhodné <strong>objectName</strong>, což nám usnadní život při samotném programování. V případě objektu třídy <strong>QLabel</strong> rovněž nastavte vlastnost <strong>text</strong> na nějakou pěknou větu, kterou po kliknutí uživatele překvapíme. Pokud si nyní celý projekt zkompilujete a spustíte, zaskočí vás, že tento řetězec se v okně vyskytuje. Abychom tomu zabránili a vytvořili tak dojem skrytého prvku, zavoláme v konstruktoru naší třídy odpovídající funkci <strong>hide</strong>().</p>
<div id="attachment_51" style="width: 405px" class="wp-caption aligncenter"><a href="http://szj.cz/wp-content/uploads/2011/10/pred-kliknutim.jpg"><img class="size-full wp-image-51" title="pred-kliknutim" src="http://szj.cz/wp-content/uploads/2011/10/pred-kliknutim.jpg" alt="Okno před kliknutím" width="395" height="183" /></a><p class="wp-caption-text">Okno před kliknutím</p></div>
<p>&nbsp;</p>
<div id="attachment_53" style="width: 405px" class="wp-caption aligncenter"><a href="http://szj.cz/wp-content/uploads/2011/10/po-kliknuti.jpg"><img class="size-full wp-image-53" title="po-kliknuti" src="http://szj.cz/wp-content/uploads/2011/10/po-kliknuti.jpg" alt="Okno po kliknutí" width="395" height="183" /></a><p class="wp-caption-text">Okno po kliknutí</p></div>
<h2>Propojení signálu se slotem</h2>
<p>Nyní již vše funguje tak jak má. Po inicializaci programu můžete pouze kliknout na tlačítko. To však pochopitelně momentálně neví, co má v případě signálu <strong>clicked</strong>() vykonat. K tomuto účelu musíme vytvořit v úvodu nastíněné propojení. Učiníme tak opět v konstruktoru s pomocí funkce <strong>connect</strong>. Povšimněte si vyžadovaných parametrů. Nejprve specifikujeme objekt, který odesílá signál. Následně již přijde na řadu jeho konkretizace. Poté pokračujeme zadáním příjemce. V našem případě se zde nachází slovíčko <strong>this</strong>, protože slot uvedený jako poslední patří do stejné třídy, ze které je volána funkce <strong>connect</strong>. Sloty si tak ve své podstatě můžete představit jako naprosto běžné funkce, které vykonávají vámi určené věci. K jejich zavolání přitom slouží právě signály, které mnoha způsoby produkují objekty přidané v návrhářském režimu.</p>
<p>#include &#8222;okno.h&#8220;<br />
#include &#8222;ui_okno.h&#8220;</p>
<p>okno::okno(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::okno)<br />
{<br />
    ui->setupUi(this);</p>
<p>    ui->l_text->hide();</p>
<p>    connect(ui->pb_text,SIGNAL(clicked()),this,SLOT(zobraz()));<br />
}</p>
<p>okno::~okno()<br />
{<br />
    delete ui;<br />
}</p>
<p>void okno::zobraz(){<br />
ui->l_text->show();<br />
}</p>
<p>Rád bych vás dále upozornil na pár řádků kódu v hlavičkovém souboru třídy. Jde především o sekci <strong>public slots: </strong>(pozor na zrádné a zpočátku opomíjené &#8218;<strong>s</strong>&#8218; na konci!). Zde se uvádí deklarace slotů, které bude program využívat.</p>
<p>#ifndef OKNO_H<br />
#define OKNO_H</p>
<p>#include <QWidget></p>
<p>namespace Ui {<br />
    class okno;<br />
}</p>
<p>class okno : public QWidget<br />
{<br />
    Q_OBJECT</p>
<p>public:<br />
    explicit okno(QWidget *parent = 0);<br />
    ~okno();</p>
<p>private:<br />
    Ui::okno *ui;</p>
<p>public slots:<br />
    void zobraz();<br />
};</p>
<p>#endif // OKNO_H</p>
]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-signaly-a-sloty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Qt – lineEdit a validace na zadání integerového čísla</title>
		<link>http://szj.cz/qt-%e2%80%93-lineedit-a-validace-na-zadani-integeroveho-cisla/</link>
		<comments>http://szj.cz/qt-%e2%80%93-lineedit-a-validace-na-zadani-integeroveho-cisla/#comments</comments>
		<pubDate>Wed, 28 Sep 2011 09:38:17 +0000</pubDate>
		<dc:creator><![CDATA[fredomgc]]></dc:creator>
				<category><![CDATA[Qt]]></category>
		<category><![CDATA[Label]]></category>
		<category><![CDATA[lineEdit]]></category>
		<category><![CDATA[validace]]></category>
		<category><![CDATA[validator]]></category>

		<guid isPermaLink="false">http://szj.cz/?p=40</guid>
		<description><![CDATA[Důvody, proč kontrolovat to, co uživatel zadá, jsou v celku jasné. I když totiž například vytvoříte vstupní prvek a označíte ho jako email, vždy se může najít někdo, kdo vaše instrukce zcela nepochopí a vloží zde úplně jiný údaj. Problém pak samozřejmě nastane, jakmile začnete s takovou hodnotou pracovat. Výsledkem pak mohou být docela kuriózní [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Důvody, proč kontrolovat to, co uživatel zadá, jsou v celku jasné. I když totiž například vytvoříte vstupní prvek a označíte ho jako email, vždy se může najít někdo, kdo vaše instrukce zcela nepochopí a vloží zde úplně jiný údaj. Problém pak samozřejmě nastane, jakmile začnete s takovou hodnotou pracovat. Výsledkem pak mohou být docela kuriózní situace.</p>
<h2>Třída QintValidator</h2>
<p>Způsobů, jak zkontrolovat zadaná data je pochopitelně několik. Ukážeme si však postup, který nezabere mnoho času a zvládne jej i začátečník. V rámci tohoto jednoduchého příkladu jsem se rozhodl vytvořit okno, ve kterém na nás bude po inicializaci čekat jeden lineEdit a Label, který vysvětlí, jaký vstup vyžadujeme.</p>
<p><a href="http://szj.cz/wp-content/uploads/2011/09/lineedit-validace.png"><img class="aligncenter size-full wp-image-41" title="lineedit-validace" src="http://szj.cz/wp-content/uploads/2011/09/lineedit-validace.png" alt="lineEdit - validace" width="406" height="326" /></a></p>
<p>Práci v designérském módu určitě zvládnete, stačí jen přidat oba prvky a vhodně je pojmenovat. Mnohem zajímavější činnost začíná ve třídě, která přísluší otevíranému oknu. Zde našemu lineEditu nastavíme validátor, který se postará o omezení rozsahu zadávaných hodnot. Nejprve ho však musíme vytvořit. K tomuto kroku přistoupíme v konstruktoru zvolené třídy, protože pochopitelně chceme, aby ke kontrole údajů docházelo vždy.</p>
<p>#include &#8222;widget.h&#8220;<br />
#include &#8222;ui_widget.h&#8220;<br />
#include <QIntValidator></p>
<p>Widget::Widget(QWidget *parent) :<br />
    QWidget(parent),<br />
    ui(new Ui::Widget)<br />
{<br />
    ui->setupUi(this);</p>
<p>    QIntValidator * validator;<br />
    validator = new QIntValidator(0,100,this);</p>
<p>    ui->lineEdit->setValidator(validator);<br />
}</p>
<p>Widget::~Widget()<br />
{<br />
    delete ui;<br />
}</p>
<p>Světe div se, máme hotovo. Pokud svůj program nyní zkompilujete, zjistíte, že nic jiného než integerové číslo v rozmezí 0 až 100 do lineEditu skutečně nelze zapsat. Konstruktor objektu QintValidator je pochopitelně přetížený, a proto pokud potřebujete, můžete stanovený limit velmi jednoduše odstranit. Stačí, když příslušný řádek zaměníte za tento:</p>
<p>validator = new QIntValidator(this);</p>
<p>Stále budete těžit z toho, že uživatel dokáže vložit jen platné integerové číslo. Ovšem nezapomeňte, že nyní již může jít i do záporných hodnot. Uvedené řešení se proto nehodí v případě, kdy očekáváte pouze kladný rozsah. Jako zajímavý způsob řešení uvedené situace se mi jeví stanovení horní hranice na konstantu INT_MAX, která symbolizuje maximální hodnotu integeru, což pro naše účely plně postačuje.</p>
<p>validator = new QIntValidator(0,INT_MAX,this);</p>
<h4>Příchozí dotazy:</h4><ul><li>Přidat komentář Jméno Zadejte validační kód</li></ul>]]></content:encoded>
			<wfw:commentRss>http://szj.cz/qt-%e2%80%93-lineedit-a-validace-na-zadani-integeroveho-cisla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
