QSignalMapper 信号映射

QSignalMapper类用于收集多个无参数信号,并通过整数、字符串或控件参数重新发送,避免代码重复。它允许将特定的整数、字符串与对象关联,当对象信号触发时,QSignalMapper的mapped()信号会携带关联信息,从而调用统一的槽函数处理多个相似控件。示例中展示了如何利用QSignalMapper在按钮点击事件中显示所点击按钮的文本。

QSignalMapper类收集了一系列的无参信号,然后使用相对于信号发送者来说的整数、字符串或控件参数来重新发送它们。

其实,该类的一个典型的使用场合是,大量控件都要相应槽函数,而这些槽函数的实现又大致相同。这种情况下,最直接的办法就是仍然为每一个控件的相应信号创建一个槽函数。但这会导致代码的大量重复。此时,我们就可以使用QSignalMapper来实现这种需求。

QSignalMapper类支持使用setMapping()函数将一个特定的整数或字符串和一个特定的对象关联起来。然后,可以将对象的信号连接到QSignalMapper对象的map()槽函数上,而map()槽函数又会使用与对象相关联的整数或字符串来发送mapped()信号。所以,我们只要将我们定义的一个槽函数连接到mapped()信号,即可处理大量相似控件的槽函数。

下面,我们以一个例子来说明。其界面如下:


初始化界面的代码如下:

void Widget::InitUi()
{
    names << "宋江" << "卢俊义" << "吴用" << "公孙胜"
          << "关胜" << "林冲" << "秦明" << "呼延灼"
          << "花荣" << "柴进" << "李应" << "朱仝"
          << "鲁智深" << "武松" << "董平" << "张清";
    QGridLayout *gridLayout = new QGridLayout;
    for (int i = 0; i < names.size(); ++i)
    {
        QPushButton *button = new QPushButton(names[i]);
        connect(button, SIGNAL(clicked()), signalMapper, SLOT(map()));
        signalMapper->setMapping(button, names[i]);
        gridLayout->addWidget(button, i / 4, i % 4);
    }
    connect(signalMapper, SIGNAL(mapped(QString)),
            this, SLOT(ShowName(QString)));
    setLayout(gridLayout);
}
其中,names是一个私有的QStringList变量,存储每一个按钮上的文本内容。ShowName()是我们定义的一个槽函数,我们就是让所有按钮的clicked()信号都连接到这个槽函数。在窗口类中声明如下:

public slots:
    void ShowName(QString name);

private:
    void InitUi();

private:
    Ui::Widget *ui;
    QSignalMapper* signalMapper;
    QStringList names;

ShowName()槽函数的实现如下,简单的弹出一个消息框,显示当前点击的按钮的文本内容:

void Widget::ShowName(QString name)
{
    QMessageBox::information(this, "Name", name);
}


当然,别忘了在构造函数中,调用我们的初始化界面的方法,以及实例化我们的signalMapper对象。如下:

    ui->setupUi(this);
    signalMapper = new QSignalMapper(this);
    InitUi();


最后,大家可以自行进行测试。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值