Signals e slots são usados para comunicação entre objetos, este é um recurso exclusivo do Qt e é uma das principais diferenças entre o Qt e outros frameworks. Um Signal (sinal) é emitido quando ocorre um evento em particular e um Slot é uma função que é chamada em resposta a um sinal, outros toolkits utilizam um call-back e uma função para executar este procedimento.
Existe dois modos de criar Signals/Slots, o primeiro é utilizando os recursos do Qt Design conectando os Widgets simplesmente arrastando um componente dentro do outro e escolhendo suas respectivas ações para os sinais e o Slot, deste modo nenhum código C++ será gerado e a conexão estará declarada dentro do arquivo .ui do formulário a outra maneira é por código fonte, declarando os sinais e os slots em suas respectivas classes.
Signals e Slots: http://qt-project.org/doc/qt-4.8/signalsandslots.html
Criando Sinais e Slots em Design Time
Vamos criar primeiramente os sinais e slots em Design Time para que você aprenda mais sobre a IDE visual do Qt Creator, visto que sempre criaremos sinais e slots em todos os programas daqui para frente:
1 – Crie uma nova aplicação de Widgets no Qt Creator e arraste para a tela um componente Label, um componente Horizontal Slider e um componente Progress Bar, mude a propriedade de texto do rotulo como desejar e alinhe os componentes Slider e Pogress Bar através da barra de ferramentas na opção Lay Out Vertically. Quando você alinha os componentes você pode perceber que eles estão de um novo componente chamado VerticallyLayout, este novo componente é responsável pelo alinhamento e você pode aumenta-lo ou diminui-lo e todos os widgets dentro dele serão afetados.
2 – Na barra de ferramentas clique no segundo botão chamado Edit Signals/Slot e em seguida arraste o Slider para dentro do Progress Bar, uma nova janela aparecera para que você escolha as propriedades de cada widget. Para o Slider escolha o sinal ValueChanged(int) e para a barra de progresso escolha o slot chamado setValue(int), em seguida clique em OK.
3 – Agora vamos analisar o resultado da nossa edição, você pode ver que no formulário os componentes estão conectados entre si por sinais e por slots. Isto significa que o Horizontal Slider declarou um sinal com o conteúdo de mudança de valor e o Progress Bar declarou um slot para sua propriedade valor, sendo assim tanto o sinal quanto o slot são valores inteiros e toda vez que o Slider sofrer uma mudança de valor o sinal enviará o valor para o slot que por sua vez mudara a propriedade de valor da barra de progresso, sincronizando os dois valores, veja a imagem abaixo para entender o Signal e Slot criados logo abaixo do formulário:
4 – Rode o programa e mova o Slider como desejar:
Exemplo:
Neste exemplo criamos um Signal e um Slot em Design Time para conectarmos dois componentes, visto que quando utilizamos o Design Time nenhum código C++ é necessário, o sinal e o slot criados residem dentro do código XML do formulário dentro da tag connections como você pode ver no código abaixo.
XML
Este código é gerado automaticamente e não precisa ser utilizado:
<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>438</width> <height>332</height> </rect> </property> <property name="windowTitle"> <string>Desenvolvimento Aberto</string> </property> <widget class="QWidget" name="centralWidget"> <widget class="QLabel" name="label"> <property name="geometry"> <rect> <x>6</x> <y>20</y> <width>431</width> <height>20</height> </rect> </property> <property name="font"> <font> <weight>75</weight> <bold>true</bold> </font> </property> <property name="layoutDirection"> <enum>Qt::RightToLeft</enum> </property> <property name="text"> <string>Signals e Slots</string> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> <widget class="QWidget" name="layoutWidget"> <property name="geometry"> <rect> <x>30</x> <y>120</y> <width>381</width> <height>62</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QSlider" name="horizontalSlider"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> </widget> </item> <item> <widget class="QProgressBar" name="progressBar"> <property name="value"> <number>24</number> </property> </widget> </item> </layout> </widget> </widget> <widget class="QMenuBar" name="menuBar"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>438</width> <height>25</height> </rect> </property> </widget> <widget class="QToolBar" name="mainToolBar"> <attribute name="toolBarArea"> <enum>TopToolBarArea</enum> </attribute> <attribute name="toolBarBreak"> <bool>false</bool> </attribute> </widget> <widget class="QStatusBar" name="statusBar"/> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections> <connection> <sender>horizontalSlider</sender> <signal>valueChanged(int)</signal> <receiver>progressBar</receiver> <slot>setValue(int)</slot> <hints> <hint type="sourcelabel"> <x>207</x> <y>173</y> </hint> <hint type="destinationlabel"> <x>207</x> <y>203</y> </hint> </hints> </connection> </connections> </ui>