【Qt】QSignalMapper

QSignalMapper 是 Qt 提供的一个用于信号映射的类,它允许将多个信号源(例如按钮点击)映射到一个单一的槽函数,并传递自定义参数。这在需要根据不同的触发对象执行相似逻辑时非常有用。

用法说明

  1. 创建 QSignalMapper 实例

    
    

    cpp

    QSignalMapper* signal_mapper = new QSignalMapper(this);

  2. 连接信号与映射关系

    • 将每个按钮的 clicked() 信号连接到 signal_mapper 的 map() 槽。
    • 使用 setMapping(QObject*, int) 设置对应的映射值。
    
    

    cpp

    connect(_btn, SIGNAL(clicked()), signal_mapper, SLOT(map())); signal_mapper->setMapping(_btn, index);

  3. 绑定最终处理逻辑

    • 连接 signal_mapper 的 mapped(int) 信号到实际处理函数。
    
    

    cpp

    connect(signal_mapper, SIGNAL(mapped(int)), this, SLOT(return_val(int)));

  4. 实现槽函数

    • 在槽函数中获取传入的 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> 并链接相关模块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值