Начал изучать Qt4, возник вопрос про Сигналы и Слоты (как определить в сслоте, какая кнопка засигналила clicked())

Модератор: Модераторы разделов

Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение 0xFF »

Читаю хелп Qt'шный и чего-то никак не пойму по сабжу.... может потому-что ночь на дворе. Пользую QDevelop.
Нужно просто в Слоте класса определить, что за кнопка ему посигналила, ибо их много на форме...

Укажите пожалуйста вектор на раскопки уважаемые форумчане ;-)
Спасибо сказали:
Аватара пользователя
Clear_Mind
Сообщения: 241
Статус: Изредко заглядывающий
ОС: openSuSE 11.1

Re: Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение Clear_Mind »

схема такая:

Код: Выделить всё

connect(<объект генерирующий сигнал (!)>, SIGNAL(<собственно сигнал>), <объект "слушающий" данный сигнал>, SLOT(<функция обрабатывающая сигнал>));

объект генерирующий сигнал -- однозначно определяет "что за кнопка ему посигналила"
Bombers launch with no recall + Minutes warning of the missile fall
Take a look at your last sky + Guessing you won't have the time to cry
--- Iron Maiden (Brouther Than A Thousand Suns, 2006)
Спасибо сказали:
Аватара пользователя
GRS
Сообщения: 236
Статус: C++ Pro
ОС: Suse10.2/XP

Re: Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение GRS »

А зачем ты на все кнопки один сигнал вешаешь ? Повесь разные. Либо как вариант, унаследуй все кнопки от базового класса, в котором определи свой метод Type, который будет возвращать уникальный идентификатор, кастуй обьект в этот базовый класс, вызывай Type - и точно будешь знать что за кнопка.

Код: Выделить всё

class ButtonBase
{
public:
      ButtonBase(int nId) : m_nId(nId) {}
      int Type() { return m_nId; }
private:
      int m_nId;
};

enum
{
     BUTTON1,
     BUTTON2,
     BUTTON3,
 ....
};
class MyButton : public QPushButton, public ButtonBase
{
      MyButton(int nId, QWidget * pParent = 0) : ButtonBase(nId), QPushButton(pParent) {}
...
};
...
MyButton btn1(BUTTON1, this);
MyButton btn2(BUTTON2, this);
// где то в коде
connect(&btn1, SIGNAL(clicked()), &app, SLOT(ButtonClick()));
connect(&btn2, SIGNAL(clicked()), &app, SLOT(ButtonClick()));
// обработка
void ButtonClick()
{
     ButtonBase * pButton = dynamic_cast<ButtonBase*>(sender());
     if (!pButton)
        return; // это не наша кнопка или вообще не кнопка
     switch (pButton->Type())
     {
      case BUTTON1:
          break; // нажали кнопку 1
      case BUTTON2:
          break; // нажали кнопку 2
     }
}


В общем виде как-то так, но еще раз повторю проще на каждую кнопку - свой обработчик.

Код: Выделить всё

connect(&btn1, SIGNAL(clicked()), &app, SLOT(Button1Click()));
connect(&btn2, SIGNAL(clicked()), &app, SLOT(Button2Click()));
void Button1Click() { // кликнули на кнопку btn1
void Button2Click() { // кликнули на кнопку btn2
Спасибо сказали:
Olegator
Сообщения: 2493
ОС: SuseLinux 11.2 KDE 4.3

Re: Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение Olegator »

GRS писал(а):
13.05.2008 13:55
В общем виде как-то так, но еще раз повторю проще на каждую кнопку - свой обработчик.

и проще и красивше ;)
Спасибо сказали:
Аватара пользователя
0xFF
Сообщения: 267
ОС: Gentoo

Re: Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение 0xFF »

Всем спасибо :-) ... Точно ведь можно каждую кнопку забиндить на свой слот... вот что значит бессонница ))
Тему можно закрыть.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: Начал изучать Qt4, возник вопрос про Сигналы и Слоты

Сообщение un-defined »

Можно кстати глянуть на функцию sender() ... Если не хочется плодить слоты, а все делать в одной функции, т.е. ответить напрямую на вопрос автора темы.
Хотя конечно лучше плодить слоты.
Don`t try - just do or do not ©Master Joda
Спасибо сказали: