美文网首页
Qt 多个信号关联同一个槽函数

Qt 多个信号关联同一个槽函数

作者: hao_developer | 来源:发表于2023-02-26 16:11 被阅读0次

背景:多个信号需要执行同一个函数或者一类函数的时候,可以选择每个信号创建一个槽函数去实现功能,如果直接关联到一个函数中,该函数只能执行一份功能,有时候并不能满足业务需求

在多个信号绑定到同一个槽函数的状态下,让槽函数根据绑定的不同的信号执行不同的功能有两种方法:

(1)在槽函数中获取到sender对象,反向解析出信号的名称,分叉执行;

(2)使用QSingalMapper类:管理多个信号,槽函数的处理相对变得简单。

具体来看:

(1)反向获取Sender名称

关键函数:

QObject::sender()                  // 在槽函数中获取信号
QObject::setObjectName(QString)    // 给QObject对象设置名称
QObject::objectName()              // 获取QObject对象名称
QObject_cast<QObject>(object)      // 强转对象类型

思路如下:


image.png

示例代码如下:

 typedef enum{
   BUTTON_1,
   BUTTON_2,
   BUTTON_3,
   BUTTON_4
 }BUTTON;
 push_button_1->setObjectName(QString::number(BUTTON_1, 10));
 push_button_2->setObjectName(QString::number(BUTTON_2, 10));
 tool_button_1->setObjectName(QString::number(BUTTON_3, 10));
 tool_button_2->setObjectName(QString::number(BUTTON_4, 10));
 connect(push_button_1, &QPushButton::clicked, this, &MyWidget::changeButton);
 connect(push_button_2, &QPushButton::clicked, this, &MyWidget::changeButton);
 connect(tool_button_1, &QToolButton::clicked, this, &MyWidget::changeButton);
 connect(tool_button_2, &QToolButton::clicked, this, &MyWidget::changeButton);
  
void MyWidget::changeButton()
{
  QObject *object = QObject::sender();
  QPushButton *push_button = qobject_cast<QPushButton *>(object);
  QToolButton *tool_button = qobject_cast<QToolButton *>(object);
  int index;
  if(push_button)
  {
     QString object_name = push_button->objectName();
     index = object_name.toInt();
  }
  else if(tool_button )
  {
     QString object_name = tool_button->objectName();
     index = object_name.toInt();
  }
 
  QString information = QString("");
  switch(index)
  {
    case BUTTON_1:
      information = QString("clicked 1");
      break;

    case BUTTON_2:
      information = QString("clicked 2");
      break;
  
    case BUTTON_3:
      information = QString("clicked 3");
      break;

    case BUTTON_4:
      information = QString("clicked 4");
      break;

  default:
      information = QString("which is clicked?");
     break;
  }
  QMessageBox::information(NULL, QString("Title"), information);
 }

( 2 ) 使用QSignalMapper类

这个思想是:希望能够在信号关联中直接传递一个参数!直接用信号槽无法实现

QSignalMapper类内置了一个Map表,将Singnal和参数对应起来,然后多个信号关联到Mapper上,由mapper负责管理,并且mapper关联到槽函数中,将对应的参数传入槽函数

这个流程图如下:


image.png

实例代码如下:

QSignalMapper *signal_mapper = new QSignalMapper(this);
connect(push_button_1, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(push_button_2, &QPushButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_1, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
connect(tool_button_2, &QToolButton::clicked, signal_mapper, &QSignalMapper::map);
 
signal_mapper->setMapping(push_button_1, QString::number(BUTTON_1, 10));
signal_mapper->setMapping(push_button_2, QString::number(BUTTON_2, 10));
signal_mapper->setMapping(tool_button_1, QString::number(BUTTON_3, 10));
signal_mapper->setMapping(tool_button_2, QString::number(BUTTON_4, 10));
connect(signal_mapper, &QSignalMapper::mapped, this, &MyWidget::changeButton);
 
void MyWidget::changeButton(QString text)
{
     int index = text.toInt();
     QString information = QString("");
     switch(index)
     {
     case BUTTON_1:
         information = QString("clicked 1");
         break;
  
     case BUTTON_2:
         information = QString("clicked 2");
         break;
  
     case BUTTON_3:
         information = QString("clicked 3");
         break;
  
     case BUTTON_4:
         information = QString("clicked 4");
         break;
  
     default:
         information = QString("which is clicked?");
         break;
     }
     QMessageBox::information(NULL, QString("Title"), information);
 }

相关文章

  • Qt 编译错误: QMetaObject::connectSlo

    首先,我们需要了解Qt信号和槽关联的方式有哪些?我所知道的Qt信号和槽关联方式一般有两种,一种是利用控件自动绑定信...

  • Qt5 - 3. 自定义信号&槽

    信号&槽是 Qt 的核心特性之一,Qt 允许我们自定义信号&槽,因此我们可以在 Qt 程序中定义我们自己的信号&槽...

  • PyQt5学习笔记(十三):重新实现信号槽过程

    在 Qt 中有非常多好用的信号槽函数,这些都是默认的,事实上我们完全可以在 PyQt 中重新实现这些信号槽的过程。...

  • 信号与槽

    在Qt Designer中设置信号与槽 信号(signal) 槽(slot) 是Qt的核心机制,也是PyQt的核心...

  • Qt信号槽(signal and slot)机制初识

    写在前面 本文主要介绍Qt信号槽(signal and slot)机制,介绍Qt信号槽机制的含义,用途以及如何简单...

  • Qt事件循环原理

    之前在信号槽的时候讲到了如果connect的时候选择QueuedConnection,Qt会把槽函数包装成一个QM...

  • 2018-10-26

    Qt信号和槽连接失败的原因主要有一下几点: 槽函数并没有在类的public slots(private slots...

  • signal and slot

    信号与槽,是Qt的核心机制,pyqt 是python对Qt的完全封装,因此,信号与槽也是pyqt的核心机制。 通...

  • Qt信号槽

    信号和槽机制是 QT 的核心机制,所有从 QObject 或其子类 ( 例如 Qwidget) 派生的类都能够包含...

  • QT信号槽

    说明 该文只记录信号槽的简单用法,方便今后忘记如何使用时回看,避免浪费更多时间。就不赘述信号槽是啥了。 前提:创建...

网友评论

      本文标题:Qt 多个信号关联同一个槽函数

      本文链接:https://www.haomeiwen.com/subject/gmlcldtx.html