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

Napsat komentář