问:将多个输入小部件与valueChanged(int)信号连接到单个插槽?

时间:2014-07-02 12:47:52

标签: c++ qt signals-slots

使用Qt 4.8我以编程方式创建了许多输入小部件(QSpinBoxQSlider)。 最后,我希望有一个方法来处理任何这些输入小部件的更改,最好是通过索引。

但是,这些小部件只有一个带参数的信号,例如: valueChanged(int)这与QSignalMapper()的广告位map()不兼容。

正如评论中指出的那样,连接确实有效!

    connect(    spinbox,        SIGNAL( valueChanged(int)  ),
                signalMapper,   SLOT(   map()            )
                );

现在我只需要获取值,但这不能通过sender()方法完成,因为现在这是SignalMapper。

<小时/> 原始问题:

除了(重新)实施QSignalMapper以及其他参数或者没有参数valueChanged()的小部件,还是使用objectNameQObject::sender()以及插槽以查看哪个元素已更改(并获取新值)?

2 个答案:

答案 0 :(得分:1)

您可以使用QAbstractSpinBox::editingFinished()QAbstractSlider::sliderReleased()作为信号,它们是无参数的。

不幸的是没有QAbstractSlider::valueChanged()的无参数版本,所以如果你想在滑块移动时连续发出信号,你可能需要继承QSlider并创建它。 E.g。

class MySlider : public QSlider
{
   ...
   private slots:
      void HandleValueChanged(int) { emit valueChanged(); }
   signals:
      void valueChanged();
};

MySlider::MySlider(...)
{
    connect(this, SIGNAL(valueChanged(int)), this, SLOT(HandleValueChanged(int)));
}

虽然我承认,这可能不是最优雅的解决方案。

答案 1 :(得分:0)

如果我理解你的问题以及你现在所拥有的东西,你就错过了两个部分。

mapper->setMapping(<spinbox>, <id or name or pointer to the spinbox);
connect(mapper, SIGNAL(mapped(<datatype you used in setMapping()>),
this, SLOT(HandleValueChanged(<datatype you used in setMapping()>)));

因此HandleValueChanged()广告位将收到您的发件人的标识符,然后您可以使用相应的getter直接访问发件人的值。 方法setMapping()将整数,QString或指向窗口小部件的指针作为第二个参数。然后通过映射器的mapped()信号转发,以便稍后识别发出信号的小部件。