Archiv pro rubriku: Qt

Qt – tabulka

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.

Qt - tabulka

QTableWidget

Pokud si do vyhledávacího pole v návrhářském režimu zadáte termín „table“, 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 QTableWidget. Do karet dále nahrává množství funkcí oproti QTableView.

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á setHorizontalHeaderLabels(QStringList). 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řidání řádku probíhá obdobně. Jednoduše jej vložíte za aktuální poslední záznam díky metodě insertRow(int). Množství používaných řádků vám přitom prozradí rowCount().

Zpracování informací

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 item(int, int) avšak jako QtableWidgetItem *. Kýžený QString poté zprostředkuje text().

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

#include

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

QStringList list;
list.append(„Jméno“);
list.append(„Příjmení“);
ui->tableWidget->setColumnCount(list.size());
ui->tableWidget->setHorizontalHeaderLabels(list);

setWindowTitle(„Tabulka“);

connect(ui->pb_info,SIGNAL(clicked()),this,SLOT(vypsat_info()));
connect(ui->pb_pridat,SIGNAL(clicked()),this,SLOT(pridat_radek()));
}

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

void widget::pridat_radek()
{
ui->tableWidget->insertRow(ui->tableWidget->rowCount());
}

void widget::vypsat_info()
{
for(int i = 0; i < ui->tableWidget->rowCount();i++)
{
QMessageBox::information(this,QString::number(i+1)+“. řádek“,“Jméno: „+
ui->tableWidget->item(i,0)->text()+“\n“+
„Příjmení: „+
ui->tableWidget->item(i,1)->text()
);
}
}

Qt – propojování signálů a slotů

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.

Grafické propojení

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.

Grafické propojení

Signals & Slots Editor

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

Editor signálů a slotů

Connect

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

connect(ui->pb_barva,SIGNAL(clicked()),this,SLOT(barva()));

Qt – získání barvy a náhodného čísla

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 "tajemna", 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í plainTextEditu. 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í.

Qt - získání barvy - krok 1

Qt - získání barvy - krok 2

Qt - získání barvy - krok 3

QColorDialog

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 QColorDialog. Jako parametr getColor přitom uvádíme náhodně zvolenou barvu, kterou přiřazuje do proměnnéswitch. Jako výsledek přitom obdržíte platný QColor jen v případě, že uživatel dialogové okno nezruší s pomocí Cancel. Toho lze krásně využít v podmínce, která tuto skutečnost testuje. O celou verifikaci se postará metoda isValid(). Samotná proměnná typu QColor však k nastavení pozadí nestačí. PlainTextEdit totiž nic podobného jako setColor(QColor) nezná. Musí proto dojít ke zrodu palety (QPalette), která v sobě obsahuje různé barvy jednoho objektu a identifikuje je díky ColorRole (v našem případě Qpalette::Base). Nově vzniklou paletu poté již stačí plainTextEditu nastavit s pomocí setPalette(QPalette). V konstruktoru si přitom povšimněte nastavení vlastnosti autoFillBackgroung na true, což zajistí vyplnění pozadí.

Náhodná čísla

Před samotným generováním musíme provést inicializaci. Funkce qsrand 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 qrand 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.

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

#include
#include

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

ui->plainTextEdit->setAutoFillBackground(true);
this->setWindowTitle(„Barva“);

connect(ui->pb_konec,SIGNAL(clicked()),this,SLOT(close()));
connect(ui->pb_barva,SIGNAL(clicked()),this,SLOT(barva()));

}

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

void Widget::barva()
{
QColor prednastavena;
QTime pulnoc(0,0,0,0);
qsrand(pulnoc.secsTo(QTime::currentTime()));
int nahodna = qrand() % 3;

switch (nahodna){
case 0:
prednastavena = Qt::black;
break;

case 1:
prednastavena = Qt::red;
break;

case 2:
prednastavena = Qt::blue;
break;

}

QColor barva = QColorDialog::getColor(prednastavena);

if(barva.isValid() == true)
{
QPalette paleta;
paleta.setColor(QPalette::Base,barva);
ui->plainTextEdit->setPalette(paleta);
}
}