将多个参数传递给插槽
Pass multiple arguments to slot
我目前正在与我的一个朋友一起在游戏中进行游戏,现在我们有点被卡住了。我们需要将两个参数传递给一个插槽。我想将一个插槽用于两个按钮,其中一个按钮将用于添加,另一个按钮将用于减去。这将是参数之一,要么是0(减去)或1(用于添加)。另一个论点将是一种ID,因为我将有这两个按钮的几组。我在代码中使用了其他几个插槽,在这些插槽上,我一直在使用qsignalMapper:
Button * button = new Button(argument1, argument2, argument3);
int num = 1;
QSignalMapper * signalMapper = new QSignalMapper(this);
connect(button, SIGNAL(clicked()), signalMapper, SLOT(map)));
signalMapper->setMapping(button, num);
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(mySlot(int)));
scene->addItem(button);
有什么办法可以将两个参数传递给一个插槽?
改用sender()
函数:
void mySlot()
{
if (sender() == addButton)
...
else
...
}
在您的情况下,您可以从mySlot
中删除int
参数,并执行以下操作:
connect(addButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));
connect(subButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));
然后使用sender
函数确定源。
直接回答您的问题,是的,您可以定义一个最多接受8个参数(PRE C 11)或任何数字(C 11或更高版本)的插槽。问题是它们必须连接到具有多个或多个参数的信号。
示例,如果您的信号带有签名notify(int, bool, QString)
,则可以将其连接到带有以下任何签名的插槽:
-
someSlot(int)
-
someSlot(int, bool)
-
someSlot(int, bool, QString)
QSignalMapper
仅具有一个参数。但是您可以使用以下方法之一将按钮分为几组:
- 从已知数字启动每个设置ID,即第一组从100开始,第二组从200开始等等,您可以轻松地检测到第一个集合和按钮ID的100:102的设置= 2;
- 使用
QString
映射,您可以在其中使用一些令牌将设置号从按钮编号(即1;2
)(第一组,按钮ID = 2)使用QString::split()
。
插槽的示例:
void mySLot (const QString& id)
{
QStringList tokens = id.split (";");
if (tokens.count () == 2) {
int setId = tokens.at(0).toInt ();
int buttonId = tokens.at(1).toInt ();
/* Your code goes here */
}
}
[完全修订的答案]
因此,我们有一个具有多个参数的按钮对象,需要在插槽中传递。
class Button
{
Q_OBJECT
public:
int m_arg1, m_arg2, m_arg3;
Button(int arg1, int arg2, int arg3)
{
m_arg1 = arg1;
m_arg2 = arg2;
m_arg3 = arg3;
};
/// some function that emits a click signal with 2 of my arguments
void doSomething()
{
emit clicked (m_arg2, m_arg3);
}
signals:
void clicked(int, int);
};
然后,以后:
Button *button = new Button(val1, val2, val3);
connect(button, SIGNAL(clicked(int, int)), this, SLOT(mySlot(int, int)));
MyReceiver::mySlot(int a1, int a2)
{
// see who called me, then use arguments
if (addButton == sender())
{
x = a1 + a2;
}
else if (subButton == sender())
{
x= a1 - a2;
}
}
相关文章:
- 升压信号2将插槽传递到成员功能以断开连接
- Qt5:连接:如果插槽的参数少于信号,如何使用"连接"
- Qt moveToThread,带有参数的信号/插槽
- 发生 Qt5.11 应用插件构建错误:信号和插槽参数不兼容
- Qt C++:静态断言失败:信号和插槽参数不兼容
- QMetaObject::invokeMethod的插槽参数
- 文档在哪里说明如果参数不是从末端删除参数,则无法从QT信号插槽连接中删除参数?
- 在插槽中传递多个参数
- 传递函数指针代替插槽函数
- 在Qt信号和插槽中使用lambda语法并访问传递的参数
- Qt - 使用λ函数修改先前连接信号的插槽参数
- 通过QT中的信号和插槽系统传递变量
- 将多个参数传递给插槽
- 将自定义参数传递到Qt/C++中的插槽
- 在 qt 中传递带有信号和插槽的参数
- Qt插槽参数已损坏
- QT:将强类型枚举参数传递到插槽
- 在插槽中传递QString
- 通过QT的信号/插槽系统传递通用异常作为参数
- Qt信号:将动态分配参数的所有权传递给插槽