使用Qt 4.8我以编程方式创建了许多输入小部件(QSpinBox,QSlider)。 最后,我希望有一个方法来处理任何这些输入小部件的更改,最好是通过索引。
但是,这些小部件只有一个带参数的信号,例如: valueChanged(int)
。
这与QSignalMapper()的广告位 map()
不兼容。
正如评论中指出的那样,连接确实有效!
connect( spinbox, SIGNAL( valueChanged(int) ),
signalMapper, SLOT( map() )
);
现在我只需要获取值,但这不能通过sender()方法完成,因为现在这是SignalMapper。
<小时/> 原始问题:
除了(重新)实施QSignalMapper
以及其他参数或者没有参数valueChanged()
的小部件,还是使用objectName
和QObject::sender()
以及插槽以查看哪个元素已更改(并获取新值)?
答案 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()信号转发,以便稍后识别发出信号的小部件。