Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何识别插槽中发出的信号?_C++_Qt_Qt Signals_Slot - Fatal编程技术网

C++ 如何识别插槽中发出的信号?

C++ 如何识别插槽中发出的信号?,c++,qt,qt-signals,slot,C++,Qt,Qt Signals,Slot,我将两个信号连接到同一个插槽。像这样: check = new QCheckBox(); connect(check, SIGNAL(clicked()), this, SLOT(MySlot())); connect(check, SIGNAL(toggled(bool)),this,SLOT(MySlot())); 我不想定义其他插槽。在MySlot中,是否可以识别哪个信号回调插槽? 我该怎么做 您可能可以使用与发送方关联的QMetaObject/QMetaMethod数据来获取您想要的未

我将两个信号连接到同一个插槽。像这样:

check = new QCheckBox();
connect(check, SIGNAL(clicked()), this, SLOT(MySlot()));
connect(check, SIGNAL(toggled(bool)),this,SLOT(MySlot()));
我不想定义其他插槽。在MySlot中,是否可以识别哪个信号回调插槽?
我该怎么做

您可能可以使用与发送方关联的QMetaObject/QMetaMethod数据来获取您想要的未测试内容

void MyClass::MySlot ()
{
  auto index = senderSignalIndex();
  if (index == sender()->indexOfSignal("clicked()")) {

    /*
     * Got here as the result of a clicked() signal.
     */
  } else if (index == sender()->indexOfSignal("toggled(bool)")) {

    /*
     * Got here as the result of a toggled(bool) signal.
     */
  }
}
然而,如果您使用的是Qt5,我建议您使用新的signal/slot语法以及lambdas

check = new QCheckBox();
connect(check, &QCheckBox::clicked,
        [this]()
        {
          MySlot(false);
        });
connect(check, &QCheckBox::toggled,
        [this](bool toggled)
        {
          MySlot(true, toggled);
        });
随着MySlot签名的更改


您可能能够使用与发送方关联的QMetaObject/QMetaMethod数据来获取您想要的未测试内容

void MyClass::MySlot ()
{
  auto index = senderSignalIndex();
  if (index == sender()->indexOfSignal("clicked()")) {

    /*
     * Got here as the result of a clicked() signal.
     */
  } else if (index == sender()->indexOfSignal("toggled(bool)")) {

    /*
     * Got here as the result of a toggled(bool) signal.
     */
  }
}
然而,如果您使用的是Qt5,我建议您使用新的signal/slot语法以及lambdas

check = new QCheckBox();
connect(check, &QCheckBox::clicked,
        [this]()
        {
          MySlot(false);
        });
connect(check, &QCheckBox::toggled,
        [this](bool toggled)
        {
          MySlot(true, toggled);
        });
随着MySlot签名的更改


可以使用lambdas动态定义新插槽:

class MyClass : public QWidget {
  QSomeLayout m_layout{this};
  QCheckBox m_check;
  enum Signal { Clicked, Toggled };

  Q_SLOT void mySlot(Signal);
public:
  MyClass( ... ) : ... {
    m_layout.addWidget(&m_check);
    connect(&m_check, &QCheckBox::clicked, this, [this]{ mySlot(Clicked); });
    connect(&m_check, &QCheckBox::toggled, this, [this]{ mySlot(Toggled); });
  }
};

可以使用lambdas动态定义新插槽:

class MyClass : public QWidget {
  QSomeLayout m_layout{this};
  QCheckBox m_check;
  enum Signal { Clicked, Toggled };

  Q_SLOT void mySlot(Signal);
public:
  MyClass( ... ) : ... {
    m_layout.addWidget(&m_check);
    connect(&m_check, &QCheckBox::clicked, this, [this]{ mySlot(Clicked); });
    connect(&m_check, &QCheckBox::toggled, this, [this]{ mySlot(Toggled); });
  }
};

如果有帮助,您还可以将自己的上下文添加到信号中。例如,我有一个为多个窗口下载用户化身的服务。我需要窗口只加载它感兴趣的用户,这样我就可以将用户的id作为上下文传递。比如:

void UserService::downloadAvatar(const QString& url, const int context = 0) {
  ...// Make the http request, on finished:

  emit onAvatarDownloaded(context, responseBody);

}

如果有帮助,您还可以将自己的上下文添加到信号中。例如,我有一个为多个窗口下载用户化身的服务。我需要窗口只加载它感兴趣的用户,这样我就可以将用户的id作为上下文传递。比如:

void UserService::downloadAvatar(const QString& url, const int context = 0) {
  ...// Make the http request, on finished:

  emit onAvatarDownloaded(context, responseBody);

}

您可以使用获取这些信息,但请注意文档中的警告:警告:此函数违反了面向对象的模块化原则。。。您可以使用获取这些信息,但请注意文档中的警告:警告:此函数违反了面向对象的模块化原则。。。谢谢你抽出时间。枚举信号{单击,切换};这是个好把戏!谢谢你抽出时间。枚举信号{单击,切换};这是个好把戏!