Соединяет сигнал Qt-объекта со слотом Qt-объекта или публичным методом PHP-объекта
Использование
void connect(object $sender, string $signal, object $receiver, string $slot);
Создаёт соединение между сигналом $signal
объекта-отправителя $sender
и методом $slot
в объекте-приёмнике $receiver
.
Возвращает TRUE, если соединение удалось; в противном случае возвращает FALSE.
Функция-слот должна быть определена через модификатор public, т.е. публично.
При соединении сигнала Qt-объекта с методом PHP-объекта (слотом), необходимо помнить, что первым аргументом (независимо от количества аргументов, передаваемых сигналом) в слот всегда передаётся ссылка на объект, сгенерировавший сигнал. Это означает, что в слоте, соединяемом с сигналом, количество аргументов должно быть на 1 больше. Однако, функция SLOT() должна принимать сигнатуру без учёта этого аргумента.
К примеру, если сигнал передает 1 аргумент с типом bool, то код для соединения и слот будут такими:
connect($QObject_sender, SIGNAL('someSignal(bool)'),
$PHP_receiver, SLOT('someSlot(bool)'));
public function someSlot($QObject_sender, $bool_value) {
/* ... */
}
Функция connect также имеет упрощённую сигнатуру вида
void connect(object $sender, string $signal, callable $closure);
которая создаёт соединение между сигналом $signal
объекта-отправителя $sender
и анонимной функцией $closure
. Первым аргументом анонимной функции так же будет
являться ссылка на объект, сгенерировавший сигнал.
Примеры
/**
* ConnectExample
*
* Пример соединения сигнала Qt-объекта со слотом PHP-объекта
*/
class ConnectExample extends QWidget {
public function __construct() {
parent::__construct();
$this->initComponents();
}
public function initComponents() {
// Создаём две кнопки
$button_one = new QPushButton($this);
$button_one->objectName = 'button_one';
$button_one->text = 'Нажми на меня!';
$button_two = new QPushButton($this);
$button_two->objectName = 'button_two';
$button_two->text = 'Не нажимать!';
$button_two->checkable = true;
// Соединяем сигнал clicked() кнопки $button_one
// с функцией-слотом buttonClicked_slot()
connect($button_one, SIGNAL('clicked()'),
$this, SLOT('buttonClicked_slot()'));
// Соединяем сигнал clicked(bool) кнопки $button_two
// с анонимной функцией
connect($button_two, SIGNAL('clicked(bool)'), function($sender, $checked) {
$msg = ($checked ? "Нажали" : "Отжали") . " кнопку {$sender->objectName}";
QMessageBox::warning(null, "Предупреждение", $msg);
});
// Размещаем кнопки на форме
$layout = new QVboxLayout;
$layout->addWidget($button_one);
$layout->addWidget($button_two);
$this->setLayout($layout);
}
/**
* Функция-слот будет вызвана при срабатывании сигнала clicked()
*
* @param Object $sender объект сгенерировавший сигнал
*/
public function buttonClicked_slot($sender) {
QMessageBox::information(null,
"Информация",
"Нажали кнопку " . $sender->objectName);
}
}
$window = new ConnectExample;
$window->show();