• [Qt基础-07 QSignalMapper]


    QSignalMapper

    本文主要根据QT官方帮助文档以及日常使用,简单的介绍一下QSignalMapper的功能以及使用


    简介

    QSignalMapper是一个将已知发射对象和信号绑定在一起的类。通过看帮助文档中的内容,其主要的作用是将一个无参信号绑定一个参数,然后再将这个信号加上这个参数转发出去。

    应用场景一般是:你有一些信号,这些信号对应的槽函数内容都差不多,最简单的方法是给每一个信号都连接一个槽函数。但这样做,会让代码多一些不必要的复杂,这种情况下,你就可以使用QSignalMapper

    使用方法

    根据官方文档中的例子,使用的方法是:

    QSignalMapper *mapper = new QSignalMapper(this);
    QStringList buttonText = {"button", "button_2", "button_3"};
    
    for (int i = 0; i < buttonText.size(); i++) {
        QPushButton *button = new QPushButton(this);
        // 1. 把要转发的信号和QSignalMapper的map信号进行连接
        connect(button, &QPushButton::clicked, mapper, &QSignalMapper::map);
        // 2. 设置信号的映射关系
        mapper->setMapping(button, buttonText.at(i));
    }
    
    // 3. 将QSignalMapper的转发信号连接起来
    connect(mapper, QOverload<const QString &>::of(&QSignalMapper::mapped),
            [const QString &text] () {
                qDebug() << text;
            });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    这个方法在QT引入lambda作为槽函数之前,确实是一个好的方法。但是引入了lambda之后,就可以像下面这样,用lambda函数写,更加的方便。

    QSignalMapper *mapper = new QSignalMapper(this);
    QStringList buttonText = {"button", "button_2", "button_3"};
    
    for (int i = 0; i < buttonText.size(); i++) {
        QString text = buttonText.at(i);
        QPushButton *button = new QPushButton(this);
        connect(button, &QPushButton::clicked, [=] () {
            qDebug() << text;
        });
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    主要的函数

    1. setMapping(设置对象和转发参数的映射关系)

      该函数的原型为:

      void setMapping(QObject *sender, int id);
      void setMapping(QObject *sender, QString text);
      void setMapping(QObject *sender, QWidget *widget);
      void setMapping(QObject *sender, QObject *object);
      
      • 1
      • 2
      • 3
      • 4

      作用是设置对象和转发参数的映射关系,也就是设置对象的信号转发之后,重新发射的信号所带的参数。

    2. removeMappings(删除指定对象的映射关系)

      该函数的原型为:

      void removeMappings(QObject* sender);
      
      • 1

      作用是移除指定对象信号的映射关系。

    3. mapping(获取对象和转发参数的映射关系)

      函数原型为:

      QObject * mapping(int id) const
      QObject * mapping(const QString &id) const
      QObject * mapping(QWidget *widget) const
      QObject * mapping(QObject *object) const
      
      • 1
      • 2
      • 3
      • 4

      该函数的作用是,根据转发的参数,来获取对应的对象。

    信号和槽

    槽函数

    1. map

      函数原型为:

      void map(QObject *sender)
      void map()
      
      • 1
      • 2

      带参数的这个map函数,是会发射sender这个对象所映射的信号。而不带参数的这个map函数会根据槽函数所连接的信号,来发射对应的带参数的信号。

    信号

    1. mapped

      函数的原型为:

      void mapped(QObject *object)
      void mapped(QWidget *widget)
      void mapped(const QString &text)
      void mapped(int i)
      
      • 1
      • 2
      • 3
      • 4

      这个信号,是根据对象所绑定的参数,来决定发射信号的参数
      因为这个信号是重载的函数,如果需要用函数指针的方式来连接信号的话:

      connect(mapper, QOverload<const QString &>::of(&QSignalMapper::mapped), 
             [const QString &text] () {
                 qDebug() << text;
             });
      
      • 1
      • 2
      • 3
      • 4
  • 相关阅读:
    LeNet(pytorch实现
    记录关于Ajax二次加载出的内容无法再次实现Ajax点击效果问题
    分布式中灰度方案实践
    免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
    MySQL性能优化——MYSQL执行流程
    word中输入文字后面的文件被覆盖掉了
    [linux学习笔记]02 gcc安装与使用
    Python基础内容补充
    Java-IO流之字节流(上篇)
    ebay、虾皮、Lazada、poshmark等跨境本土店群多账号如何做防关联
  • 原文地址:https://blog.csdn.net/qq_44723937/article/details/126004709