【Qt】QSignalMapper
QSignalMapper
是 Qt 提供的一个用于信号映射的类,它允许将多个信号源(例如按钮点击)映射到一个单一的槽函数,并传递自定义参数。这在需要根据不同的触发对象执行相似逻辑时非常有用。
用法说明
-
创建
QSignalMapper
实例:cpp
QSignalMapper* signal_mapper = new QSignalMapper(this);
-
连接信号与映射关系:
- 将每个按钮的
clicked()
信号连接到signal_mapper
的map()
槽。 - 使用
setMapping(QObject*, int)
设置对应的映射值。
cpp
connect(_btn, SIGNAL(clicked()), signal_mapper, SLOT(map())); signal_mapper->setMapping(_btn, index);
- 将每个按钮的
-
绑定最终处理逻辑:
- 连接
signal_mapper
的mapped(int)
信号到实际处理函数。
cpp
connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(return_val(int)));
- 连接
-
实现槽函数:
- 在槽函数中获取传入的
int
值并执行相应操作。
cpp
void PromptWidget::return_val(int index) { // 处理逻辑 }
- 在槽函数中获取传入的
示例代码片段
cpp
QSignalMapper* signal_mapper = new QSignalMapper(this);for (int index = 0; index < max_len; index++) {QPushButton* _btn = new QPushButton(btn_name[index], this);btn_layout->addWidget(_btn);connect(_btn, SIGNAL(clicked()), signal_mapper, SLOT(map()));signal_mapper->setMapping(_btn, return_val[index]);if (index == focus_idx) {_btn->setFocus();}
}connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(return_val(int)));
注意事项
QSignalMapper
已被标记为过时,在 Qt 5 中仍可用,但在 Qt 6 中已被移除。推荐使用QMetaObject::invokeMethod
或 Lambda 表达式替代。- 如果你使用的是 Qt 5 及以上版本,请确保正确包含头文件
<QSignalMapper>
并链接相关模块。