Qt слоты карри
Есть ли способ прорезать карри qt? Может быть, есть что-то похожее на карринг?
4 ответа
Вы можете использовать QSignalMapper для привязки, подключить к нему некоторые сигналы и затем подключить свои собственные сигналы к целевым слотам с некоторыми прикрепленными параметрами.
// connect signal to mapper
signalMapper = new QSignalMapper(this);
signalMapper->setMapping(button1, QString("param1"));
signalMapper->setMapping(button2, QString("param2"));
connect(button1, SIGNAL(clicked()), signalMapper, SLOT(map()));
connect(button2, SIGNAL(clicked()), signalMapper, SLOT(map()));
// connect mapper signal to slot
connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(originalSlot(const QString &)));
Хотя использование Qt напрямую невозможно, некоторая привязка / каррирование доступна через LibQxt. Например и из документов QxtBoundFunction:
Безусловно, наиболее распространенным ожидаемым использованием является предоставление параметра в слот, когда сигнал не предлагает его. Многие разработчики, не знакомые с Qt, пытаются написать код, подобный следующему: \code connect(button, SIGNAL(clicked()), lineEdit, SLOT(setText("Hello, world"))); \endcode Опытные разработчики Qt тут же обнаружат недостаток. Типичное решение - создать короткий однострочный слот-обертку, который вызывает нужную функцию. Некоторые умные разработчики могут даже использовать QSignalMapper для обработки слотов, которым нужен только один параметр int или QString.
QxtBoundFunction позволяет записать предыдущий оператор connect следующим образом: \code connect(button, SIGNAL(clicked()), QxtMetaObject::bind(lineEdit, SLOT(setText(QString)), Q_ARG(QString, "Hello, world!"))); \code Это дает тот же результат без необходимости создавать новый слот или, что еще хуже, целый объект, просто чтобы передать постоянное значение.
Кроме того, с помощью макроса QXT_BIND параметры из сигнала могут быть переставлены, пропущены или переданы вместе с постоянными аргументами, предоставленными макросом Q_ARG. Это может использоваться, например, для обеспечения обратных вызовов с сохранением состояния для универсальной функции.
Многие виды функций могут быть связаны. Наиболее распространенная привязка применяется к сигналам и слотам Qt, но стандартные функции C/C++ также могут быть связаны. Дальнейшая разработка может добавить возможность привязки к функциям-членам C++, и разработчики могут создавать собственные подклассы QxtBoundFunction для еще большей гибкости, если это необходимо.
Несмотря на то, что я отправил несколько исправлений в LibQxt, я не использовал это напрямую, поэтому ваш пробег может отличаться.
Привязка аргументов невозможна при использовании сигнала / слотов Qt. Вместо этого вам придется использовать boost:: сигналов и boost::bind, чтобы достичь такой функциональности.
Конечно, теперь у нас есть Qt 5 и возможность подключать сигналы к произвольным вызываемым объектам:
connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg));
connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });