Несовместимые аргументы отправителя/получателя

Я хочу написать Signalmapper. Он должен связать кнопку с функцией. Эта функция должна получить саму нажатую кнопку Qpushbutton.

   void StrategicWidget::addTransporterImages(int i,unsigned int  numberTransporters)
      {
      Planet* p = PLANETS_VEC[i];
      QString qBasePath = QString::fromStdString(basePath);
       for(int j=0; j<numberTransporters; j++)
      {
         QPushButton* button = new QPushButton("", this);
         button->setGeometry(QRect(QPoint(p->getXCoord() + 30 + 15*j, p->getYCoord()+ 30 + 15*j), QSize(53, 53)));
         QString css = "background-image: url(" + qBasePath + "/Transporter.png)";
         button->setStyleSheet(css);  // sets button background image

      /*
       *SignalMapper zum festlegen welcher transporter der zu bewegende Transporter ist.
       *
       */
      QSignalMapper* transporterMapper = new QSignalMapper (button);
      // connecting button signal with signal mapper
       connect (button, SIGNAL(clicked()), transporterMapper, SLOT(map())) ;

      // giving parameter to the buttons
      transporterMapper->setMapping (button, button); 
      // map the signalMapper mapped signal to the transporterIconClicked-Slot of this widget
      connect (transporterMapper, SIGNAL(mapped(int)), this, SLOT(transporterIconClicked(QPushButton*)));

      }
    }

Почему я получаю это сообщение об ошибке во время выполнения?

QObject::connect: Несовместимые аргументы отправителя/получателя QSignalMapper::mapped(int) --> asteroids::StrategicWidget::transporterIconClicked(QPushButton*)

Я знаю, что некоторые другие сообщения также включают эту проблему, но решения не сработали для меня.


person ansanders    schedule 08.03.2015    source источник


Ответы (1)


Что ж, вы соединяете сигнал с аргументом int со слотом, принимающим QPushButton*. Что вы ожидали? Это не может работать.

Вместо этого вам нужно подключить сигнал mapped(QWidget*) к слоту, принимающему QWidget*, а затем убедиться, что вы действительно получили кнопку:

void addTransporterImages(int i, unsigned int numberTransporters) {
  ...
  connect (transporterMapper, SIGNAL(mapped(QWidget*)), 
    SLOT(transporterIconClicked(QWidget*)));
  ...
}

Q_SLOT void transporterIconClicked(QWidget * widget) {
  auto button = qobject_cast<QPushButton*>(widget);
  if (!button) return;
  ....
}
person Kuba hasn't forgotten Monica    schedule 08.03.2015