如何从单击的事件中获取呼叫按钮

时间:2011-03-04 06:37:18

标签: qt signals-slots pyside multiplexing

我正在尝试制作一个小gui来部署.ear和.war文件 当地的玻璃鱼安装。所以我已经制作了五行包含一个 文件名字段,复选框和用于调出文件对话框的按钮 找到战争/耳朵文件。让所有按钮调用会很好 相同的功能和从功能中挑选出来的五个 拨打电话的按钮(更新正确的文本字段)。别 知道这是否是以面向对象的方式进行的预期方式 但我唯一的gui编程经验是一些旧的win16事件 循环:)。

// BRG Anders Olme

2 个答案:

答案 0 :(得分:9)

QPushButton *buttonA = new QPushButton("A");
QPushButton *buttonB = new QPushButton("B");
QPushButton *buttonC = new QPushButton("C");

buttonA->setObjectName("A");
buttonB->setObjectName("B");
buttonC->setObjectName("C");

connect(buttonA, SIGNAL(clicked()), this, SLOT(testSlot()));
connect(buttonB, SIGNAL(clicked()), this, SLOT(testSlot()));
connect(buttonC, SIGNAL(clicked()), this, SLOT(testSlot()));

//Now in slot implementation
void QWidget::testSlot()
{
  QObject *senderObj = sender(); // This will give Sender object
  // This will give obejct name for above it will give "A", "B", "C"
  QString senderObjName = senderObj->objectName(); 

  if(senderObjName == "A")
  {
   //Implement Button A Specific 
  }
  //Similarly for "B" and "C"
  if(senderObjName == "B")
  {
   //Implement Button B Specific 
  }
  if(senderObjName == "C")
  {
   //Implement Button C Specific 
  }
}

我已经使用这种方法来实现这种情况,因为代码更具可读性,但随着字符串比较的出现可能会非常耗时。 谢谢!

答案 1 :(得分:8)

将每个按钮的click()信号连接到同一个插槽,并使用此插槽中的QObject * QObject::sender () const [protected]找出发送信号的按钮(被点击)。或者,您可以使用QSignalMapper,这是一个专门为此类任务而制作的特殊类。