8

我正在尝试制作一个小 gui 来在我的本地 glassfish 安装上部署 .ear 和 .war 文件。所以我做了五行,其中包含一个文件名字段、一个复选框和一个按钮来调出一个文件对话框来定位 war/ear 文件。最好让所有按钮调用相同的函数,并从函数中找出五个按钮中的哪一个进行调用(以更新正确的文本字段)。不知道这是否是以面向对象的方式进行的预期方式,但我唯一的 gui 编程经验是一些旧的 win16 事件循环:)。

//BRG安德斯奥尔梅

4

2 回答 2

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 
  }
}

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

于 2014-09-09T10:05:30.900 回答
8

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

于 2011-03-04T08:12:38.597 回答