Russian Qt Forum

Qt => Вопросы новичков => Тема начата: niag от Июль 25, 2011, 14:44



Название: получение названия кнопки при нажатии
Отправлено: niag от Июль 25, 2011, 14:44
всем привет!

совсем новичковый вопрос, но как-то так сложилось, что никогда с подобной проблемой не связывался.
есть некоторый набор кнопок. в зависимости от того, какая кнопка была нажата появляется виджет (всегда один и тот же) с информацией, соответствующий нажатой кнопке.

итак, как бы это выглядело, если бы была всего одна кнопка:
Код:
connect(theButton, SIGNAL(clicked()), this, SLOT(theSlot()));

но так как кнопок много, в качестве параметра к слоту theSlot нужно указать нажатую кнопку, т. е.

Код:
public slots:
   void theSlot(QPushButton*);

как это можно реализовать? ведь в качестве параметра у сигнала ничего не должно быть. легкое гугление так и не дало ощутимых результатов :(


Название: Re: получение названия кнопки при нажатии
Отправлено: LisandreL от Июль 25, 2011, 14:48
Кастуем sender() в QPushButton*.


Название: Re: получение названия кнопки при нажатии
Отправлено: niag от Июль 25, 2011, 15:10
Код:
...
   connect(theButton, SIGNAL(clicked()), this, SLOT(theSlot()));
...

void TheClass::theSlot() {
   QPushButton *button = (QPushButton *)sender();
   ...
}

так?  никогда просто с sender() не работал :)


Название: Re: получение названия кнопки при нажатии
Отправлено: LisandreL от Июль 25, 2011, 15:29
Код
C++ (Qt)
void TheClass::theSlot() {
  QPushButton* button = dynamic_cast<QPushButton*>( sender() );
  if ( button != 0 )
  {
       ... //Ваш код
  }
  else
  {
       Q_ASSERT(button != 0);
  }
}


Название: Re: получение названия кнопки при нажатии
Отправлено: niag от Июль 25, 2011, 15:43
спасибо :)


Название: Re: получение названия кнопки при нажатии
Отправлено: Странник от Июль 25, 2011, 17:24
а если использовать qobject_cast, то совсем по фэн-шую)


Название: Re: получение названия кнопки при нажатии
Отправлено: Kolobok от Июль 25, 2011, 17:36
по фэн-шую - это QSignalMapper.


Название: Re: получение названия кнопки при нажатии
Отправлено: niag от Июль 30, 2011, 20:34
попробовал всё вместе, не выходит (не переходит при нажатии в clickAction) :(:

Код
C++ (Qt)
   theSignalMapper = new QSignalMapper(this);
   connect(theSignalMapper, SIGNAL(mapped(QWidget *)),
                   this, SLOT(clickAction(QWidget *)));
 
   for (i = 0; i < n; i++) {
 
       testButton = new QPushButton(QString::number(i));
 
       theSignalMapper->setMapping(testButton, QString::number(i));
       connect(testButton, SIGNAL(clicked()), theSignalMapper, SLOT(map()));
       theLayout->addWidget(testButton, i/3, i%3, Qt::AlignTop);
   }
 
 
Код
C++ (Qt)
void TheClass::clickAction(QWidget *w) {
   qDebug() << "clicked";
 
   QPushButton * currentButton = qobject_cast<QPushButton *>(w);
 
   if (currentButton != 0) {
       theAction(currentButton);
   }
 
   else {
       Q_ASSERT(currentButton != 0);
   }
}
 

это первая проблема.
вторая: хотел сделать ряд кнопок в лэйауте (назовем его л0), при нажатии которых появляется какой-нибудь лэйаут (этот пусть будет л1) с виджитами, допустим имя кнопки и еще одна кнопка. и вот нажав на появившуюся кнопку должен появиться еще один лейаут (л2) с кнопкой, который перенес бы информацию о самой первой кнопке (которая находится в л0). после нажатия на кнопку из л2, должен появитсья еще один лэйаут с кнопкой, передающей инфомрацию о копке из л0 и т. д. рекурсия в общем :) как такое сделать? некоторые попытки уже были, но заканчивались они плачевно/

заранее спасибо за помощь


Название: Re: получение названия кнопки при нажатии
Отправлено: Kolobok от Июль 30, 2011, 21:03
Код:
theSignalMapper->setMapping(testButton, testButton);


Название: Re: получение названия кнопки при нажатии
Отправлено: niag от Июль 30, 2011, 22:40
спасибо, с первой проблемой вроде бы понятно


Название: Re: получение названия кнопки при нажатии
Отправлено: niag от Июль 31, 2011, 02:04
вторая проблема решена, так что помощь больше не требуется... пока  ;D