2011-01-24 67 views
6

有没有方法咖喱qt插槽?也许有类似curryng的东西?qt插槽柯里

+0

能否请您给的例子是你心目中的? – 2011-01-24 17:22:53

+0

看起来像http://stackoverflow.com/questions/3166051/binding-arguments-to-signals-slots – 2011-01-24 19:46:03

回答

1

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

绑定参数是不可能使用Qt信号/插槽。你将不得不使用boost :: signals和boost :: bind来实现这样的功能。

+0

的副本LibQxt也是一个选项,请参阅我的答案。 – 2011-01-24 21:49:29

4

尽管不可能直接使用Qt,但通过LibQxt可以获得一些绑定/ currying。例如,距离的QxtBoundFunction文档:

到目前为止,最常用的预期用途是提供一个参数,以当所述 信号不具有提供一个槽。许多新开发Qt的开发人员尝试编写如下代码: \ code connect(button,SIGNAL(clicked()),lineEdit,SLOT(setText(“Hello,world”))); \ endcode 有经验的Qt开发人员会立即发现这个缺陷。典型的解决方案 用于创建一个简短的单行封装插槽来调用所需的功能。一些巧妙的开发人员甚至可以使用QSignalMapper来处理只需要一个 int或QString参数的插槽。

QxtBoundFunction使得这样写的前一个连接语句: \代码 连接(按钮,SIGNAL(点击()),QxtMetaObject ::绑定(lineEdit, SLOT(的setText(QString的)),Q_ARG(QString的, “你好,世界!”))); \ code 这样做可以实现相同的结果,而无需创建新插槽,或者更糟糕的情况下只需传递一个常量值即可。

另外,通过使用QXT_BIND宏的,从信号 参数可被重新安排,省略,或旁边与Q_ARG宏提供 恒定参数传递。例如,这可用于为通用功能提供有状态的回调。

可以绑定多种功能。最常见的绑定适用于Qt信号和插槽,但标准C/C++函数也可以绑定。 未来的开发可能会增加绑定到C++成员函数的能力,如果需要,开发人员可以为自定义的QxtBoundFunction子类提供更多的灵活性。

虽然我已经提交了一些补丁到LibQxt,但我没有直接使用这个,所以你的里程可能会有所不同。

0

当然,现在我们的Qt 5和信号连接至任意调用对象的能力:

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

connect(sender, &MyClass::mySignal, receiver, [=] { receiver->mySlot(boundArg); });