Qt слоты карри - PullRequest
       47

Qt слоты карри

6 голосов
/ 24 января 2011

Есть ли способ карри qt слот?Может быть, есть что-то похожее на карринг?

Ответы [ 4 ]

4 голосов
/ 25 января 2011

Хотя это невозможно напрямую с помощью Qt, некоторая привязка / каррирование доступна через LibQxt . Например и из документов QxtBoundFunction :

На сегодняшний день наиболее распространенным ожидаемым использованием является предоставление параметра в слот, когда Сигнал не предлагать один. Многие разработчики, плохо знакомые с Qt, пытаются написать такой код: \код подключиться (кнопка, СИГНАЛ (нажал ()), lineEdit, SLOT (setText ("Hello, world"))); \ ENDCODE Опытные разработчики Qt тут же обнаружат недостаток. Типичное решение заключается в создании короткого однострочного слота-обертки, который вызывает нужную функцию. Немного умные разработчики могут даже использовать QSignalMapper для обработки слотов, которые нуждаются только в одном Параметр int или QString.

QxtBoundFunction позволяет записать предыдущий оператор connect следующим образом: \код connect (кнопка, SIGNAL (clicked ()), QxtMetaObject :: bind (lineEdit, SLOT (setText (QString)), Q_ARG (QString, «Привет, мир!»))); \код Это приводит к тому же результату без необходимости создавать новый слот, или хуже, весь объект, просто чтобы передать постоянное значение.

Кроме того, с помощью макроса QXT_BIND параметры из сигнала может быть переставлен, пропущен или передан вместе с постоянными аргументами с макросом Q_ARG. Это можно использовать для обеспечения обратных вызовов с сохранением состояния универсальная функция, например.

Многие виды функций могут быть связаны. Наиболее распространенная привязка относится к Сигналы и слоты Qt, но стандартные функции C / C ++ также могут быть связаны. Дальнейшее развитие может добавить возможность привязки к функциям-членам C ++, и разработчики могут сделать собственные подклассы QxtBoundFunction для еще большего гибкость при необходимости.

Хотя я отправил несколько исправлений в LibQxt, я не использовал это напрямую, поэтому ваш пробег может отличаться.

2 голосов
/ 24 января 2011

Связывание аргументов невозможно при использовании сигнала / слотов Qt.Вместо этого вам придется использовать boost :: сигналов и boost :: bind, чтобы достичь такой функциональности.

1 голос
/ 13 сентября 2011

Вы можете использовать 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 &)));
0 голосов
/ 11 декабря 2016

Конечно, теперь у нас есть Qt 5 и возможность подключать сигналы к произвольным вызываемым объектам:

connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg));

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...