1

我目前正在和我的一个朋友一起做一个游戏,现在我们有点卡住了。我们需要将两个参数传递给一个插槽。我想为两个按钮使用一个插槽,其中一个按钮用于加法,另一个用于减法。这将是参数之一,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);

有什么办法可以将两个参数传递给一个插槽?

4

3 回答 3

4

请改用该sender()功能:

void mySlot()
{
    if (sender() == addButton)
        ...
    else
        ...
}

在您的情况下,您可以从中删除int参数mySlot并执行以下操作:

 connect(addButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));
 connect(subButton, SIGNAL(clicked()), someObject, SLOT(mySlot()));

然后使用该sender函数确定来源。

要直接回答您的问题,是的,您可以定义一个最多接受 8 个参数(C++11 之前)或任何数字(C++11 或更高版本)的插槽。问题是它们必须连接到具有尽可能多或更多参数的信号。

例如,如果您有一个带有签名的信号,notify(int, bool, QString)您可以将其连接到具有以下任何签名的插槽:

  • someSlot(int)
  • someSlot(int, bool)
  • someSlot(int, bool, QString)
于 2016-06-23T20:42:02.693 回答
3

QSignalMapper只有一个参数。但是您可以使用以下方法之一将按钮拆分为多个集合:

  • 每组ID从一个已知的数字开始,即第一组从100开始,第二组从200开始,以此类推,你可以很容易地检测出一个数字除以100的一组:102代表第一组,按钮ID = 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 */
    }
}
于 2016-06-23T20:28:04.440 回答
2

[完全修改答案]

因此,我们有一个带有多个参数的 Button 对象,这些参数需要在插槽中传递。

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;
  }
}
于 2016-06-23T20:44:20.947 回答