Qt:将多个输入部件与valueChanged(int)信号连接到单个插槽
Qt: Connecting multiple input widgets with valueChanged(int) signals to single slot?
使用Qt 4.8,我以编程方式创建了许多输入小部件(QSpinBox, QSlider)。最后,我希望有一个单一的方法来处理任何这些输入小部件的更改,理想情况下是通过索引。
然而,这些小部件只有一个带有参数的信号,例如valueChanged(int)
。这与QSignalMapper()的插槽map()
不兼容。
正如在评论中指出的那样,连接确实有效!
connect( spinbox, SIGNAL( valueChanged(int) ),
signalMapper, SLOT( map() )
);
现在我只需要获取值,但这不能再通过sender()方法完成,因为这现在是SignalMapper。
最初的问题:
除了(重新)实现QSignalMapper
与附加参数或无参数的valueChanged()
为小部件或使用objectName
和QObject::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()信号进行转发,这样您就可以稍后确定是哪个小部件发出了该信号。
- 为什么在全局范围内使用"extern int a"似乎不行?
- Qt VTK交互风格的信号到小部件
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何使用信号帧Changed(int)在QT中播放QMovie一次
- PyQt5:使用自定义信号时 int 对象的错误转换
- 将 24 位有符号 int 信号转换为 16 位有符号 int 信号
- 如何使用QT5中的lambdas将具有int参数的信号连接到具有枚举参数with的插槽
- HDF5在磁盘上将32位无符号int写入64位,并读取32位无信号int
- 在Linux上编译简单信号代码时,从void*到void (*) int的无效转换错误
- Qt - QCheckBox不发出stateChanged(int state)信号
- Qt:将多个输入部件与valueChanged(int)信号连接到单个插槽
- Qt5.QMediaPlayer bufferStatusChanged(int)信号不工作