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

Qt: Connecting multiple input widgets with valueChanged(int) signals to single slot?

本文关键字:信号 int 连接 插槽 单个 valueChanged 输入部 Qt      更新时间:2023-10-16

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

然而,这些小部件只有一个带有参数的信号,例如valueChanged(int)这与QSignalMapper()的插槽map()不兼容。

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

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

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


最初的问题:

除了(重新)实现QSignalMapper与附加参数或无参数的valueChanged()为小部件或使用objectNameQObject::sender(),以便槽看到哪个元素改变(并获得新的值)有另一种方法吗?

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

不幸的是,没有无参数的QAbstractSlider::valueChanged()版本,所以如果你想要一个信号连续发出,因为滑动条移动,你可能需要子类QSlider并创建它。例如

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)));
}

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

如果我正确理解你的问题和你到现在为止所拥有的,你缺少两个部分。

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()信号进行转发,这样您就可以稍后确定是哪个小部件发出了该信号。