有没有办法咖喱qt插槽?也许有类似curryng的东西?
4 回答
尽管不能直接使用 Qt,但可以通过LibQxt获得一些绑定/柯里化。例如,来自QxtBoundFunction的文档:
到目前为止,最常见的预期用途是在信号没有提供参数时为插槽提供参数。许多刚接触 Qt 的开发人员尝试编写如下代码: \code connect(button, SIGNAL(clicked()), lineEdit, SLOT(setText("Hello, world"))); \endcode 有经验的 Qt 开发人员会立即发现这里的缺陷。典型的解决方案是创建一个简短的单行包装槽来调用所需的功能。一些聪明的开发者甚至可能使用 QSignalMapper 来处理只需要一个 int 或 QString 参数的槽。
QxtBoundFunction 使前面的连接语句可以这样写: \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::signals 和 boost::bind 来实现这样的功能。
您可以使用 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 5 以及将信号连接到任意可调用对象的能力:
connect(sender, &MyClass::mySignal, receiver, std::bind(&OtherClass::mySlot, boundArg));
connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });