Сигналы и слоты (Qt)

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
(С параметрами)
(поправил тэг коде)
 
(11 промежуточных версий не показаны.)
Строка 11: Строка 11:
* указатель на объект-получатель
* указатель на объект-получатель
* слот объекта-получателя
* слот объекта-получателя
 +
* тип соединения
-
При соединении сигнало в и слотов можно передавать параметры от сигнала к слоту, если существует сответствующая пара сигнал/слот.
+
При соединении сигналов и слотов можно передавать параметры от сигнала к слоту, если существует сответствующая пара сигнал/слот.
=== Без параметров ===
=== Без параметров ===
-
{{code|qt|code=
+
<source lang=cpp-qt>
-
QPushButton btn_quit = new QPushButton("Quit",wgt);
+
QPushButton *btn_quit = new QPushButton("Quit",wgt);
...
...
QObject::connect(btn_quit, SIGNAL(clicked()), qApp, SLOT(quit()));
QObject::connect(btn_quit, SIGNAL(clicked()), qApp, SLOT(quit()));
-
}}
+
</source>
В этом примере сигнал [[Qt:Документация_4.3.2/qabstractbutton#clicked|clicked()]] от кнопки '''btn_quit''' соеденяется со слотом [[Qt:Документация_4.3.2/qcoreapplication#quit|quit()]] приложения (qApp - глобальный указатель на экземпляр приложения)
В этом примере сигнал [[Qt:Документация_4.3.2/qabstractbutton#clicked|clicked()]] от кнопки '''btn_quit''' соеденяется со слотом [[Qt:Документация_4.3.2/qcoreapplication#quit|quit()]] приложения (qApp - глобальный указатель на экземпляр приложения)
Строка 25: Строка 26:
При соединении  сигналов и слотов с передачей параметров следует помнить замечание указанное в описании к [[Qt:Документация_4.3.2/qobject#connect|QObject::connect()]]. Т.е. имена аргументов должны быть опущены.  
При соединении  сигналов и слотов с передачей параметров следует помнить замечание указанное в описании к [[Qt:Документация_4.3.2/qobject#connect|QObject::connect()]]. Т.е. имена аргументов должны быть опущены.  
-
Неправильно:
+
[[Изображение:Attention niels epting.svg|18px]] Неправильно:
-
{{code|qt|code=
+
<source lang=cpp-qt>
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));
-
}}
+
</source>
Правильно:
Правильно:
-
{{code|qt|code=
+
<source lang=cpp-qt>
QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));
-
}}
+
</source>
 +
В этом примере сигнал [[Qt:Документация_4.3.2/qabstractslider#valueChanged|valueChanged()]] от линейки прокрутки '''scrollBar''' соеденяется со слотом [[Qt:Документация_4.3.2/qlabel#setNum-2|setNum()]] текстовой метки '''label'''. Сигнал передает параметр типа ''int'' - текущая позиция ползунка. Слот метки имеет такой же тип входного аргумента (сигнатуры сигнала и слота должны всегда совпадать). После соединения этой пары сигнал/слот, при изменении положения ползунка, в текстовой метке будет отбражатся текущая позиция ползунка.
 +
 
 +
=== С типом соединения ===
 +
Тип соединения используется при работе с сигналами и слотами для указания как нужно доставлять сигнал слоту: немедленно или ставится в очередь, блокировать поток в котором он выполняется или нет.
 +
 
 +
Типы соединения и их описание вы можете посмотреть в перечислении [[Qt:Документация 4.3.2/qt#ConnectionType-enum | Qt::ConnectionType]].
== Объявление собственных сигналов и слотов ==
== Объявление собственных сигналов и слотов ==
 +
 +
 +
[[Категория:Qt FAQ]]

Текущая версия на 15:49, 18 октября 2009

Библиотека Qt предоставляет гибкую систему уведомления и обмена данными между объектами. Эта система реализуется посредством концепции сигналов и слотов.

Содержание

[править] Соединение сигналов и слотов

Соединение сигналов и слотов осуществляется:

  1. В классах наследниках от QObject функцией connect().
  2. В прочих местах программы с помощью статической функциии-члена QObject::connect()

Аргументами этой функции являются:

  • указатель на объект-отправитель
  • сигнал объекта-отправителя
  • указатель на объект-получатель
  • слот объекта-получателя
  • тип соединения

При соединении сигналов и слотов можно передавать параметры от сигнала к слоту, если существует сответствующая пара сигнал/слот.

[править] Без параметров

QPushButton *btn_quit = new QPushButton("Quit",wgt);
...
QObject::connect(btn_quit, SIGNAL(clicked()), qApp, SLOT(quit()));

В этом примере сигнал clicked() от кнопки btn_quit соеденяется со слотом quit() приложения (qApp - глобальный указатель на экземпляр приложения)

[править] С параметрами

При соединении сигналов и слотов с передачей параметров следует помнить замечание указанное в описании к QObject::connect(). Т.е. имена аргументов должны быть опущены.

18px Неправильно:

QObject::connect(scrollBar, SIGNAL(valueChanged(int value)), label, SLOT(setNum(int value)));

Правильно:

QObject::connect(scrollBar, SIGNAL(valueChanged(int)), label, SLOT(setNum(int)));

В этом примере сигнал valueChanged() от линейки прокрутки scrollBar соеденяется со слотом setNum() текстовой метки label. Сигнал передает параметр типа int - текущая позиция ползунка. Слот метки имеет такой же тип входного аргумента (сигнатуры сигнала и слота должны всегда совпадать). После соединения этой пары сигнал/слот, при изменении положения ползунка, в текстовой метке будет отбражатся текущая позиция ползунка.

[править] С типом соединения

Тип соединения используется при работе с сигналами и слотами для указания как нужно доставлять сигнал слоту: немедленно или ставится в очередь, блокировать поток в котором он выполняется или нет.

Типы соединения и их описание вы можете посмотреть в перечислении Qt::ConnectionType.

[править] Объявление собственных сигналов и слотов