Как получить кнопку вызова из кликаемого события - PullRequest
8 голосов
/ 04 марта 2011

Я пытаюсь создать небольшой графический интерфейс для развертывания файлов .ear и .war на моей локальной установке Glassfish.Итак, я сделал пять строк, содержащих поле имени файла, флажок и кнопку, чтобы открыть диалоговое окно файла, чтобы найти файл war / ear.Было бы неплохо, чтобы все кнопки вызывали одну и ту же функцию и из этой функции выясняли, какая из пяти кнопок сделала вызов (чтобы обновить правильные текстовые поля).Не знаю, является ли это намеченным способом сделать это объектно-ориентированным способом, но мой единственный опыт программирования на графическом интерфейсе - это старые циклы событий win16:).

// BRG Anders Olme

Ответы [ 2 ]

9 голосов
/ 09 сентября 2014
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 
  }
}

Я использовал этот метод для реализации такого случая, потому что код более читабелен, но это может занять много времени, так как происходит сравнение строк.Спасибо!

8 голосов
/ 04 марта 2011

Соедините сигнал click() каждой кнопки с одним и тем же слотом и используйте QObject * QObject::sender () const [protected] в этом слоте, чтобы узнать, какая кнопка отправила сигнал (был нажат).В качестве альтернативы вы можете использовать QSignalMapper, который является специальным классом, созданным специально для такого рода задач.

...