Как подключить сигнал и слот без использования функции подключения?

Есть ли способ соединить сигнал и слот без использования функции подключения?

Если путь существует, приведите несколько примеров.

0

Решение

Нет, другого пути нет, по крайней мере, в публичном API. В Qt4 есть только connect() функция с SIGNAL() а также SLOT макросъемки ().

В Qt5 у вас есть другой синтаксис безопасного типа соединения, но он все еще использует connect() функция. А в QML вы можете использовать «прикрепленные обработчики» — onSignal: doStuff() — но это только для QML.

4

Другие решения

Есть способ использовать интерфейс мета-вызовов, чтобы избежать использования функции connect (). В зависимости от того, что именно вам нужно сделать, хотя это может быть не то решение, которое вы ищете, или это может быть.

По сути, вы определяете функцию слота обратного вызова в вашем классе QOBJECT с определенным синтаксисом и позволяете MOC разобрать «соединение».

Скажем так, вы хотели использовать:

connect(ui->actionButton, SIGNAL(triggered()), this, SLOT(someCallbackSlot()));

но без необходимости использовать функцию обратного вызова …

Вы можете сделать это неявно с определенным синтаксисом функции-члена в QOBJECT, который получает сигнал:

class MyQtObj : public QWidget
{
QObject

private slots:

void on_actionButton_triggered();

}

Где on_actionButton_triggered является функциональным эквивалентом someCallbackSlot (), actionButton — это имя источника кнопки / действия / сигнала, а triggered () — излучаемый сигнал.

Таким образом, любая из этих функций действительна при условии правильности излучателя сигнала:

void on_minimizedButton_clicked();

void on_closeButton_released();

так далее

Когда вы запустите мета-объектный компилятор Qt и сгенерируете файл moc_.cpp этого класса, появится функция qt_static_metacall; это содержит оператор switch, который выглядит следующим образом:

void MyQtObj::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
MyQtObj*_t = static_cast<MyQtObj*>(_o);
Q_UNUSED(_t)
switch (_id) {
case 0: _t->on_actionButton_triggered(); break;
default: ;
}
}
}

Если вы установите точку останова и запустите свое действие / кнопку / сигнал, то увидите, что ваша функция будет выполнена.

Я не слишком уверен в деталях, как это работает, и я заметил это, когда я использовал этот безкадровый код окна Qt и теперь принял его в моих собственных проектах Qt C ++.

0

По вопросам рекламы [email protected]