Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 咖喱_C++_Qt_Signals Slots_Currying - Fatal编程技术网

C++ 咖喱

C++ 咖喱,c++,qt,signals-slots,currying,C++,Qt,Signals Slots,Currying,有没有一种方法可以让你吃咖喱?可能有类似于curryng的东西?使用Qt信号/插槽无法绑定参数。您必须使用boost::signals和boost::bind来实现这些功能。尽管无法直接使用Qt,但可以通过使用来实现一些绑定/转换。例如,从以下文件: 到目前为止,最常见的预期用途是在 信号机没有提供一个。许多新加入Qt的开发人员尝试编写如下代码: \代码 连接(按钮,信号(点击()),线路编辑,插槽(setText(“你好,世界”)); \端码 有经验的Qt开发人员将立即发现此漏洞。典型的解决方

有没有一种方法可以让你吃咖喱?可能有类似于curryng的东西?

使用Qt信号/插槽无法绑定参数。您必须使用boost::signals和boost::bind来实现这些功能。

尽管无法直接使用Qt,但可以通过使用来实现一些绑定/转换。例如,从以下文件:

到目前为止,最常见的预期用途是在 信号机没有提供一个。许多新加入Qt的开发人员尝试编写如下代码: \代码 连接(按钮,信号(点击()),线路编辑,插槽(setText(“你好,世界”)); \端码 有经验的Qt开发人员将立即发现此漏洞。典型的解决方案 是创建一个调用所需函数的短的单行包装槽。一些 聪明的开发人员甚至可以使用QSignalMapper来处理只需要一个插槽的插槽 int或QString参数

QxtBoundFunction使前面的connect语句可以这样编写: \代码 连接(按钮、信号(单击())、QxtMetaObject::绑定(lineEdit、, SLOT(setText(QString)),Q_ARG(QString,“你好,世界!”); \代码 这可以实现相同的结果,而无需创建新插槽,甚至更糟, 整个对象,只是为了传递一个常量值

此外,通过使用QXT_BIND宏,可以从信号中提取参数 可以重新排列、跳过或与提供的常量参数一起传递 使用Q_ARG宏。这可用于向服务器提供有状态回调 例如,泛型函数

可以绑定多种函数。最常见的绑定适用于 Qt信号和插槽,但也可以绑定标准C/C++函数。 未来的开发可能会增加绑定C++成员函数的能力, 开发人员还可以定制QxtBoundFunction子类,以获得更多 如有必要,请提供灵活性


虽然我已经向LibQxt提交了一些补丁,但我没有直接使用它,因此您的里程数可能会有所不同

您可以使用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); });

你能举个例子说明你的想法吗?看起来LibQxt的副本也是一个选项,请看我的答案。我认为第二个
connect
调用应该是
button2
,而不是
button1
。我认为这是使这项技术有用的魔法:让信号映射器对唯一的发送者做出不同的响应。