====== 9. Qt - komunikace komponent ======
V rámci frameworku QT spolu komponenty komunikují pomocí ''signálů'' a ''slotů''. Signály jsou emitovány komponentami (např. při interakci s jejdnotlivých komponent s myší), sloty jsou metody tříd, které ošetřují reakce komponenty na signály. V první fázi seznamování s QT si vystačíme se signály, které mají komponenty vestavěné (typicky to bude signál [[https://doc.qt.io/qt-5/qabstractbutton.html#clicked|clicked]] třídy [[https://doc.qt.io/qt-5/qpushbutton.html|QPushButton]]), zatímco sloty budeme vytvářet vlastní. Celá problematika je celkem podrobně popsána na dedikované [[https://doc.qt.io/qt-5/signalsandslots.html|stránce]].
===== Podklady pro Cvičení =====
{{ :courses:b2b99ppc:tutorials:sachovnice.zip |Šachovnice}}
{{ :courses:b2b99ppc:tutorials:09_qt-signals_timer-template.zip | Časovač (šablona) }}
Deklarace slotu třídy je podobná deklaraci metody s tím, že je specifikace viditelnosti rozšířena o klíčové slovo ''slot''
class Object
{
Q_OBJECT
// ...
public slots:
clickHandler ();
};
Aby spolu mohly komponenty derivované z bázové třídy QObject komunikovat, je třeba je propojit. K tomu je možné využít hned několik způsobů
**1.** QT4 (stále funkční), používá makra ''SIGNAL'' a ''SLOT'', které převedou své argumenty na textový literál ((https://stackoverflow.com/questions/5880763/qt-signal-slot-macro-declaration))
connect (
sender, SIGNAL (valueChanged (QString, QString)),
receiver, SLOT (updateValue (QString))
);
**2.** QT5
connect (
sender, &Sender::valueChanged,
receiver, &Receiver::updateValue
);
**3.** >QT5 pomocí lambda funkcí
connect(
sender, &Sender::valueChanged,
[=]( const QString &newValue ) { receiver->updateValue( "senderValue", newValue ); }
);
===== Mapovani Nazvu Sachovnice =====
class MapovaniNazvu {
public:
static QString posName(QString name) {
if(name.contains("btn")) {
name.remove("btn");
}
int col = name[0].toLatin1() - 'A';
int row = 8 - name.mid(1).toInt();
if(row >= 2 && row <= 5) {
return QString("");
}
if(row == 1 || row == 6) {
return QString("Pesec");
}
if(row == 0 || row == 7) {
switch (col) {
case 0:
case 7:
return QString("Vez");
case 1:
case 6:
return QString("Jezdec");
case 2:
case 5:
return QString("Strelec");
case 3:
return QString("Dama");
case 4:
return QString("Kral");
}
}
return QString("");
}
};