Qt的信号映射器 QSignalMapper

       在Qt开发中,我们几乎都会使用到信号与槽的机制,在某些时候我们会碰到这样的事情,那就是很多个相同的信号执行(关联)同一个槽函数,如果我们一个一个的连接则会显得代码特别累赘,这时候我们就可以使用Qt的信号映射器,它的功能就是将很多个相同的信号(组件要为相同类型)’捆绑‘起来然后和一个槽函数进行关联,它可以自动识别信号发送者。

下面是我的示例程序,我使用了6个按钮,当单击一个按钮时它会调用一个槽函数,将按钮上的内容打印出来。实现效果图如下:
在这里插入图片描述

实现代码头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QObject>
#include <QWidget>
#include <QSignalMapper>
#include <QGridLayout>

namespace Ui {
    
    
class Widget;
}

class Widget : public QWidget
{
    
    
    Q_OBJECT
public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void printContent(QWidget*);

private:
    Ui::Widget *ui;

    QSignalMapper *m_mapper;    //信号映射器
    QGridLayout* m_layout;      //网格布局
};

#endif // WIDGET_H

实现文件:

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPushButton>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    
    
    ui->setupUi(this);

    m_layout = new QGridLayout;

    // 创建信号映射器
    m_mapper = new QSignalMapper(this);

    for(int i = 0; i < 6; ++i)
    {
    
    
        QPushButton* p = new QPushButton(QString("按钮 %1").arg(i+1));
        // 将按钮的原始点击信号传递给映射器m_mapper,然后由m_mapper统一转发
        connect(p, SIGNAL(clicked()), m_mapper, SLOT(map()));
        // 添加映射,设置信号发送对象与要发送的参数
        m_mapper->setMapping(p, p);

        m_layout->addWidget(p, (i > 2 ? 1 : 0), (i > 2 ? i - 3 : i));
    }

    // 将映射信号与槽函数连接,所接受的参数就是setMapping(p, p)当中设置的参数
    connect(m_mapper, SIGNAL(mapped(QWidget*)), this, SLOT(printContent(QWidget*)));

    setLayout(m_layout);
}

Widget::~Widget()
{
    
    
    delete ui;
}

void Widget::printContent(QWidget *btn)
{
    
    
    // 将信号发送者转换成QPushButton 然后打印文本内容
    QPushButton* p = qobject_cast<QPushButton*>(btn);
    qDebug() << p->text();
}

映射器转发简要解释
当我们点击一个按钮的时候,例如点击了按钮1,那么此时按钮1对象就会触发clicked()信号,m_mapper就会执行map()槽函数,而这个槽函数会将当前触发clicked()信号的按钮1对象作为mapped(QWidget*)信号的发送对象,而要发送的参数就是setMapping(p, p)里的第二个参数,然后执行槽函数printContent(QWidget*),然后在槽函数里面转换类型打印内容。

 

注意
如下三个类型必须一致,因为在setMapping中设置的参数就是mapped发送信号的参数,也是槽函数接受的参数。
在这里插入图片描述
除了可以设置QWidget参数类型外,还可以使用字符串等等,还有可以设置其他的,详见Qt助手。

おすすめ

転載: blog.csdn.net/qq_45337964/article/details/112384163