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í.
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);
}
}