Соединяет сигнал 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();
comments powered by HyperComments