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