Zkušenosti s Unity na netbooku

Nedávno jsem se odhodlal vyzkoušet novou verzi operačního systému Ubuntu na svém (poněkud slabším) netbooku. K tomuto rozhodnutí mě vedl především fakt, že netbook využívám pouze na prohlížení internetu, sledování videí na YouTube a tvorbu dokumentů v OpenOffice. Rozhodně proto nepotřebuji pohodlí pro hraní her, které s sebou přináší právě Windows. Pokud se chci odreagovat, volím většinou jen jednoduchou flashovku (často z armorgames.com). Některé zde dostupné tituly se opravdu snadno mohou proměnit ve žrouty času.

Ubuntu 11.04 a Unity

Mé první dojmy po dokončení instalace byly více než dobré. Dokonce jsem až byl překvapen, že mi nevadí přesunutí ikon běžících aplikací do levého sloupce. Programy lze přitom do lišty připínat a lá Windows 7. Další často diskutovaná změna, která se objevila už v předchozí distribuci, zde rovněž působila vhodným dojmem. Na mysli mám přesunutí tlačítek minimalizovat, maximalizovat a ukončit do levé části okna. Musím se přiznat, že v Ubuntu 10.04 LTS to byla první věc, kterou jsem se rozhodl okamžitě změnit. Zvyk sice symbolizuje železnou košili, Unity mi však ze záhadných důvodů nevadilo. Tedy až do doby, kdy jsem získal dojem, že se počítač nechová tak svižně, jak by měl. Efekty si zkrátka vyžádaly na slaboučkém netbooku svoji daň.

Unity

Jednoduchá deaktivace Unity

Na internetu jsem okamžitě začal hledat, jak se vrátit k tradičnímu vzhledu a uspořádání panelů. Poradím vám proto jak na to. Na přihlašovací obrazovce musíte kliknout na svoje uživatelské jméno a před zadáním hesla vybrat v dolní liště Ubuntu Classic. Jestliže se rozhodnete pro trvalé nasazení, zavítejte do nastavení Přihlašovací obrazovky (menu pro vypnutí vpravo nahoře → Nastavení systému) a vyberte Ubuntu Classic (No effects) jako výchozí sezení. Pokud zatoužíte po opětovném povolení Unity, stačí zvolit v příslušném menu volbu Ubuntu. Ve své podstatě si proto vlastně můžete přepínat libovolně prostředí dle vašeho přání.

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);