Archiv pro štítek: Qt

Qt – checkbox

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 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.

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. :-)

Qt checkbox - před zadáním

Qt checkbox - po zadání

#ifndef WIDGET_H
#define WIDGET_H

#include
#include

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
Q_OBJECT

public:
explicit Widget(QWidget *parent = 0);
~Widget();

private:
Ui::Widget *ui;
QButtonGroup *syr_skupina;

public slots:
void syr();
};

#endif // WIDGET_H

 

#include „widget.h“
#include „ui_widget.h“

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

syr_skupina = new QButtonGroup(this);
syr_skupina->addButton(ui->ch_hermelin,1);
syr_skupina->addButton(ui->ch_eidam,2);
syr_skupina->addButton(ui->ch_mozzarella,3);
syr_skupina->setExclusive(false);

}

Widget::~Widget()
{
delete ui;
}

void Widget::syr(){
QAbstractButton *vracene;
QString vysledek = „Objedávka: \n“;
int pocet = 0;

for(int i = 1; i < 4;i++){
vracene = syr_skupina->button(i);
if (vracene->isChecked()){
vysledek += vracene->text() + „\n“;
pocet++;
}
}

if(pocet == 0){
vysledek += „Není vybrán žádný sýr!“;
}else{
vysledek += „Přejeme dobrou chuť!“;
}

ui->l_vysledek->setText(vysledek);
}

 

Skupina prvků v podání QbuttonGroup

V návrhářském režimu stačí přidat několik popisných labelů a samotné checkboxy. 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ý label. Zajímavější kroky na nás čekají v konstruktoru. Vytvoříme si totiž skupinu prvků tzv. QbuttonGroup a přidáme do ní jednotlivé checkboxy. Musíme u nich specifikovat i vlastní id, které později budeme potřebovat při procházení v iteračním cyklu. S pomocí setExclusive dosáhneme toho, že se celá skupina začne chovat dle našich požadavků. Pokud bychom jako parametr předali true, získáme checkboxy fungující jako radio buttony.

Zpracování

Ve slotu, který se spouští po signálu clicked z tlačítka se provádí samotný výpis. V cyklu si projdeme jednotlivé checkboxy 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í setText výslednému labelu v hlavním okně.

Qt – signály a sloty

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ž zmíněné tlačítko a popisek (Label). Nezapomeňte vždy zadat vhodné objectName, což nám usnadní život při samotném programování. V případě objektu třídy QLabel rovněž nastavte vlastnost text 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 hide().

Okno před kliknutím

Okno před kliknutím

 

Okno po kliknutí

Okno po kliknutí

Propojení signálu se slotem

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 clicked() 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 connect. 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 this, protože slot uvedený jako poslední patří do stejné třídy, ze které je volána funkce connect. 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.

#include „okno.h“
#include „ui_okno.h“

okno::okno(QWidget *parent) :
QWidget(parent),
ui(new Ui::okno)
{
ui->setupUi(this);

ui->l_text->hide();

connect(ui->pb_text,SIGNAL(clicked()),this,SLOT(zobraz()));
}

okno::~okno()
{
delete ui;
}

void okno::zobraz(){
ui->l_text->show();
}

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 public slots: (pozor na zrádné a zpočátku opomíjené ‚s‚ na konci!). Zde se uvádí deklarace slotů, které bude program využívat.

#ifndef OKNO_H
#define OKNO_H

#include

namespace Ui {
class okno;
}

class okno : public QWidget
{
Q_OBJECT

public:
explicit okno(QWidget *parent = 0);
~okno();

private:
Ui::okno *ui;

public slots:
void zobraz();
};

#endif // OKNO_H

Qt – lineEdit a validace na zadání integerového čísla

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.

Třída QintValidator

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.

lineEdit - validace

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.

#include „widget.h“
#include „ui_widget.h“
#include

Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);

QIntValidator * validator;
validator = new QIntValidator(0,100,this);

ui->lineEdit->setValidator(validator);
}

Widget::~Widget()
{
delete ui;
}

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:

validator = new QIntValidator(this);

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.

validator = new QIntValidator(0,INT_MAX,this);

Příchozí dotazy:

  • Přidat komentář Jméno Zadejte validační kód