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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Обработчик кнопок для калькулятора  (Прочитано 9398 раз)
voodoo
Гость
« : Декабрь 12, 2011, 01:44 »

Доброе время суток!

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

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

Заранее спасибо.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #1 : Декабрь 12, 2011, 01:49 »

Это же событие, а не слот. Вместо сендера используйте this, каста не надо.
Самый банальный вариант - взять цифру из текста на кнопке.
Записан
voodoo
Гость
« Ответ #2 : Декабрь 12, 2011, 02:00 »

Цитировать
Это же событие, а не слот. Вместо сендера используйте this, каста не надо.
Я немного не понял как это должно выглядеть в коде. Не могли бы Вы показать?
Записан
BuRn
Гость
« Ответ #3 : Декабрь 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();
Записан
BuRn
Гость
« Ответ #4 : Декабрь 12, 2011, 02:14 »

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

BuRn, как тогда сделать обработчик на клавиши?
Записан
BuRn
Гость
« Ответ #6 : Декабрь 12, 2011, 02:24 »

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

Да ну это понятно Улыбающийся)) Так сделать - самый простой вариант, но будет куча лишнего кода.
Записан
BuRn
Гость
« Ответ #8 : Декабрь 12, 2011, 02:38 »

ну засунь в него тогда  mousePressEvent(QMouseEvent *e), то , что я тебе писал кинуть в обработчик
Записан
andrew.k
Гость
« Ответ #9 : Декабрь 12, 2011, 03:12 »

Да ну это понятно Улыбающийся)) Так сделать - самый простой вариант, но будет куча лишнего кода.
Одна строка это куча? Это в твоем варианте будет куча лишнего кода.
Записан
voodoo
Гость
« Ответ #10 : Декабрь 12, 2011, 03:18 »

Одна строка на 10 кнопок:) итого:)
Записан
andrew.k
Гость
« Ответ #11 : Декабрь 12, 2011, 03:19 »

Ты коннекты сигналов за код считаешь?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


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


Просмотр профиля
« Ответ #12 : Декабрь 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.
Записан
voodoo
Гость
« Ответ #13 : Декабрь 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 &)));

    }
}

Но не работает =/ ошибок куча
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Декабрь 12, 2011, 18:25 »

а память кто выделять будет?

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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