2012-02-22 85 views
4

我有更改数组的 个别元素,而不是具有单独的接收器插槽的功能自旋控制块,我想只指定在信号控制发送的消息Qt的槽与默认参数

你可以用QSignalMapper来做到这一点 - 但无论如何,它只是简单地如下所示?

spin0 = new QDoubleSpinBox; 
connect(spin0,SIGNAL(valueChanged(double)),this,SLOT(handler(0,double)); 

spin1 = new QDoubleSpinBox; 
connect(spin1,SIGNAL(valueChanged(double)),this,SLOT(handler(1,double)); 
.... 

private slot: 
void handler(int element,double value); 

回答

3

在任何插槽处理程序中,您可以使用sender()获取发送信号的对象的指针。然后您可以使用objectName()属性来沟通任何进一步的识别信息。

+0

但是,然后接收器功能需要知道gui的许多细节 - 即。有权访问所有的旋转控制对象 – 2012-02-22 23:34:35

+0

我不知道我关注你。如果您将每个旋转控件上的对象名称设置为“0”,“1”等,则可以在处理程序中使用sender() - > objectName()。toInt()来实现上述内容。处理程序不需要知道什么比发送信号的'QObject'更多。只要说明,'sender()'是handler()所在对象的函数。不需要知道所有的旋转控制。 – 2012-02-22 23:49:37

+0

确定使用对象名称,是的,这是一个很好的soln。我正在考虑将sender()与spin0 ptr进行比较,后者将gui与处理程序紧密耦合! – 2012-02-22 23:56:34

1

我不这么认为,至少没有使用语法...的SIGNALSLOT宏把他们的论点为字符串然后将其解析和使用Qt的运行时查找相关的功能和/或在编译的预处理阶段由moc创建的表中的类方法。因此,如果您将默认参数编码到SLOT宏中,那么这不是一个有效的函数签名,Qt可以使用该函数对moc生成的函数表中的实际插槽函数进行运行时查找。