Russian Qt Forum
Май 06, 2024, 10:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: получение названия кнопки при нажатии  (Прочитано 5209 раз)
niag
Гость
« : Июль 25, 2011, 14:44 »

всем привет!

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

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

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

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

как это можно реализовать? ведь в качестве параметра у сигнала ничего не должно быть. легкое гугление так и не дало ощутимых результатов Грустный
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Июль 25, 2011, 14:48 »

Кастуем sender() в QPushButton*.
Записан
niag
Гость
« Ответ #2 : Июль 25, 2011, 15:10 »

Код:
...
   connect(theButton, SIGNAL(clicked()), this, SLOT(theSlot()));
...

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

так?  никогда просто с sender() не работал Улыбающийся
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #3 : Июль 25, 2011, 15:29 »

Код
C++ (Qt)
void TheClass::theSlot() {
  QPushButton* button = dynamic_cast<QPushButton*>( sender() );
  if ( button != 0 )
  {
       ... //Ваш код
  }
  else
  {
       Q_ASSERT(button != 0);
  }
}
Записан
niag
Гость
« Ответ #4 : Июль 25, 2011, 15:43 »

спасибо Улыбающийся
Записан
Странник
Гость
« Ответ #5 : Июль 25, 2011, 17:24 »

а если использовать qobject_cast, то совсем по фэн-шую)
Записан
Kolobok
Гость
« Ответ #6 : Июль 25, 2011, 17:36 »

по фэн-шую - это QSignalMapper.
Записан
niag
Гость
« Ответ #7 : Июль 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 и т. д. рекурсия в общем Улыбающийся как такое сделать? некоторые попытки уже были, но заканчивались они плачевно/

заранее спасибо за помощь
Записан
Kolobok
Гость
« Ответ #8 : Июль 30, 2011, 21:03 »

Код:
theSignalMapper->setMapping(testButton, testButton);
Записан
niag
Гость
« Ответ #9 : Июль 30, 2011, 22:40 »

спасибо, с первой проблемой вроде бы понятно
Записан
niag
Гость
« Ответ #10 : Июль 31, 2011, 02:04 »

вторая проблема решена, так что помощь больше не требуется... пока  Смеющийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.232 секунд. Запросов: 22.