Есть ли способ соединить сигнал и слот без использования функции подключения?
Если путь существует, приведите несколько примеров.
Нет, другого пути нет, по крайней мере, в публичном API. В Qt4 есть только connect()
функция с SIGNAL()
а также SLOT
макросъемки ().
В Qt5 у вас есть другой синтаксис безопасного типа соединения, но он все еще использует connect()
функция. А в QML вы можете использовать «прикрепленные обработчики» — onSignal: doStuff()
— но это только для QML.
Есть способ использовать интерфейс мета-вызовов, чтобы избежать использования функции 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 ++.