====== 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(""); } };