Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: voodoo от Декабрь 12, 2011, 01:44



Название: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 01:44
Доброе время суток!

Решил для освоения Qt написать калькулятор.
Как при нажатии кнопки мыши по клавише, определить какая именно клавиша была нажата?
Код:
void Dialog::mousePressEvent(QMouseEvent *e)
{
    QPushButton *button_clicked = qobject_cast<QPushButton *>(sender());
    ...
    ...
    ...
}

Хочу просто сделать обработчик для клавиш 0-9, чтобы код был покомпактнее.

Заранее спасибо.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: LisandreL от Декабрь 12, 2011, 01:49
Это же событие, а не слот. Вместо сендера используйте this, каста не надо.
Самый банальный вариант - взять цифру из текста на кнопке.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 02:00
Цитировать
Это же событие, а не слот. Вместо сендера используйте this, каста не надо.
Я немного не понял как это должно выглядеть в коде. Не могли бы Вы показать?


Название: Re: Обработчик кнопок для калькулятора
Отправлено: BuRn от Декабрь 12, 2011, 02:05
можно так
где-то в коде на батон
Код:
QPushButton *button = new QPushButton;
button->setText("-");
button->setObjectName(name);
connect(button,SIGNAL(clicked()),this,SLOT(RemoveItem()));
и далее получить обжект нейм в слоте
Код:
QObject *element = (QObject *)sender();
QString name=element->objectName();


Название: Re: Обработчик кнопок для калькулятора
Отправлено: BuRn от Декабрь 12, 2011, 02:14
Код:
void Dialog::mousePressEvent(QMouseEvent *e)
{
    QPushButton *button_clicked = qobject_cast<QPushButton *>(sender());
    ...
    ...
    ...
}
И если я прав так не делаются обработчики на клавиши, ты тут обрабатываешь нажатие клавиш мыши, а нужно обрабатывать нажатие кнопки (QPushbutton ) соответственно и обработчик на него


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 02:20
BuRn, как тогда сделать обработчик на клавиши?


Название: Re: Обработчик кнопок для калькулятора
Отправлено: BuRn от Декабрь 12, 2011, 02:24
Код:
connect(button,SIGNAL(clicked()),this,SLOT(RemoveItem()));
вот
можно через гуи тоже самое сделать, на кнопку повесить обработчик ...
в классе объявляешь слот, который будет отвечать за нажатие кнопки
public slots:
void MySlot();
далее в конструкторе можно явно прописать
у тебя будет что-то типа
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(MySlot()));


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 02:27
Да ну это понятно :))) Так сделать - самый простой вариант, но будет куча лишнего кода.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: BuRn от Декабрь 12, 2011, 02:38
ну засунь в него тогда  mousePressEvent(QMouseEvent *e), то , что я тебе писал кинуть в обработчик


Название: Re: Обработчик кнопок для калькулятора
Отправлено: andrew.k от Декабрь 12, 2011, 03:12
Да ну это понятно :))) Так сделать - самый простой вариант, но будет куча лишнего кода.
Одна строка это куча? Это в твоем варианте будет куча лишнего кода.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 03:18
Одна строка на 10 кнопок:) итого:)


Название: Re: Обработчик кнопок для калькулятора
Отправлено: andrew.k от Декабрь 12, 2011, 03:19
Ты коннекты сигналов за код считаешь?


Название: Re: Обработчик кнопок для калькулятора
Отправлено: LisandreL от Декабрь 12, 2011, 08:17
Я немного не понял как это должно выглядеть в коде. Не могли бы Вы показать?
Код
C++ (Qt)
void NumberButton::mousePressEvent(QMouseEvent* e)
{
   QPushButton::mousePressEvent(e);
   bool error;
   uint number = text().toUInt(&error);
   if ( error || number > 9 )
   {
         qt_assert_x("error", "wrong number", __FILE__, __LINE__);
   }
   else
   {
         // обработчик нажатой цифровой кнопки на калькуляторе
         numberPressed( number );
   }
}
Отмечу, что события обрабатываем у кнопки, а не у диалога, как у вас.

Но вообще через сигналы кошерней. Для клавиш 0-9 можно использовать QSignalMapper.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 12, 2011, 17:24
Попытался сделать через QSignalMapper. Но не знаю к какому событию диалога привязывать "биндовку" клавиш. Попытался так:
Код:
void Dialog::finished()
{
    QSignalMapper *signalMapper;

    for(int i=0; i<10; i++)
    {
        QString button_name = "num_" + QString::number(i);
        connect(button_name,SIGNAL(clicked()),signalMapper,SLOT(map()));
        signalMapper->setMapping(button_name,QString::number(i));
        connect(signalMapper, SIGNAL(mapped(const QString &)),
                this, SLOT(clicked(const QString &)));

    }
}

Но не работает =/ ошибок куча


Название: Re: Обработчик кнопок для калькулятора
Отправлено: kambala от Декабрь 12, 2011, 18:25
а память кто выделять будет?

да и смысл замапить числа, а не строки


Название: Re: Обработчик кнопок для калькулятора
Отправлено: LisandreL от Декабрь 12, 2011, 20:11
QString button_name = "num_" + QString::number(i);
        connect(button_name,SIGNAL(clicked()),signalMapper,SLOT(map()));
Это откуда у нас появился коннект по имени объекта?


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 14, 2011, 00:27
Я просто делал по такому примеру: http://qt.ucoz.net/publ/qsignalmapper_kak_polzovatsja/1-1-0-18


Название: Re: Обработчик кнопок для калькулятора
Отправлено: LisandreL от Декабрь 14, 2011, 00:34
Я просто делал по такому примеру: http://qt.ucoz.net/publ/qsignalmapper_kak_polzovatsja/1-1-0-18
В примере в коннекте первый аргумент button типа QPushButton*.
У вас первый аргумент - button_name типа QString.
Есть некоторая разница, не находите?


Название: Re: Обработчик кнопок для калькулятора
Отправлено: voodoo от Декабрь 14, 2011, 11:25
У меня проект сделан через QtCreator, конструктором набросаны кнопки и т.п., я просто не знаю как сделать для такого варианта. Всё что нахожу в инете - так это код где ты сам, кодом, без конструктора, добавляешь объекты.


Название: Re: Обработчик кнопок для калькулятора
Отправлено: kambala от Декабрь 14, 2011, 14:39
connect(ui.myButton, ...);