Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: Alexu007 от Май 06, 2013, 12:14



Название: калькулятор
Отправлено: Alexu007 от Май 06, 2013, 12:14
Обычный калькулятор, иммитирующий внешний вид и работу:

(http://s017.radikal.ru/i431/1305/d7/2b1b91efda16.jpg)


Название: Re: калькулятор
Отправлено: m_ax от Май 06, 2013, 12:16
А для чего две левые нижние кнопки? Механизм самоуничтожения :)


Название: Re: калькулятор
Отправлено: Bepec от Май 06, 2013, 13:24
*правые*?


Название: Re: калькулятор
Отправлено: kambala от Май 06, 2013, 15:06
туда можно степень притулить


Название: Re: калькулятор
Отправлено: Bepec от Май 06, 2013, 16:25
Код конечно не блещет, зато простой :P


Название: Re: калькулятор
Отправлено: RedDog от Май 06, 2013, 16:35
иммитирующий внешний вид и работу:
Вот это не совсем понятно... Т.е. Он только иммитирует, но нифига не считает? А зачем тогда он нужен?


Название: Re: калькулятор
Отправлено: m_ax от Май 06, 2013, 16:38
*правые*?
Да, т.е. правые)
*но в какой то степени и левые)*


Название: Re: калькулятор
Отправлено: panAlexey от Май 06, 2013, 19:12
Вот калькулятор из книги Земскова (кажется) с добавленными улучшениями (и глюками)
из улучшений: режим выделения цифровых рядов апострофами(есть глюк со вводом нуля после точки), можно набирать на клавиатуре цифры|+|*|/|Энтер|= бакспейс и т.п. а не тыкать мышкой теряя время, топ-лэвел моде (мне так удобнее).


Название: Re: калькулятор
Отправлено: Alexu007 от Май 06, 2013, 20:16
Всё он считает. Есть много программ, которые пишут на экране что-то вроде 2 + 3 = 5 в строчку или в столбик. Я же хотел запрограммировать логику работы кнопок настоящего калькулятора. Сами то вычисления - что их программить?

Две пустые кнопки не знаю, каким нагрузить функционалом. Для памяти маловато, нужно четыре: М+ М- MR MC. А менять внешний вид и добавлять кнопки как-то неохота.

Обработку клавиатуры можно конечно добавить. А как в Qt получить коды нажатых клавиш, если активна не Edit, а кнопка или сама форма?


Название: Re: калькулятор
Отправлено: gil9red от Май 07, 2013, 03:50
Цитировать
Обработку клавиатуры можно конечно добавить. А как в Qt получить коды нажатых клавиш, если активна не Edit, а кнопка или сама форма?
eventfilter? :)


Название: Re: калькулятор
Отправлено: panAlexey от Май 07, 2013, 08:11
Обработку клавиатуры можно конечно добавить. А как в Qt получить коды нажатых клавиш, если активна не Edit, а кнопка или сама форма?
Посмотри Земскофский, там есть.


Название: Re: калькулятор
Отправлено: Alexu007 от Май 07, 2013, 23:40
А ссылочку на книгу Земскова не кинете? Я скачал "Программирование на C++ с использованием библиотеки Qt 4", но чё то там никаких калькуляторов нету...


Название: Re: калькулятор
Отправлено: Bepec от Май 08, 2013, 07:07
Код:
// инклуды
#include <QEvent>
#include <QKeyEvent>
// объявление в H файле
bool eventFilter(QObject *obj, QEvent *event);
// реализация в CPP
bool ИмяВашегоКласса::eventFilter(QObject *obj, QEvent *event)
{
//qDebug() << event;
// реагируем на нажатия клавиш
if (event->type() == QEvent::KeyPress /*&& obj->objectName() == "Имя виджета"*/)
{
QKeyEvent *keyEvent = qobject_cast<QKeyEvent *>(event);
switch (keyEvent->key())
{
case Qt::Key_Insert:

break;
case Qt::Key_Delete:

break;
case Qt::Key_Return:

break;
case Qt::Key_Escape:

break;
default:
qDebug() << "IMPOSSIBLE ERROR" <<  __FILE__  << __FUNCTION__  << __LINE__;
break;
}

}
return QObject::eventFilter(obj, event);

}
// установка фильтра в любой виджет
виджетУКоторогоНадоПерехватывать->installEventFilter(виджетУКоторогоИмеетсяФункцияEventFilter)


Название: Re: калькулятор
Отправлено: Alexu007 от Май 08, 2013, 13:40
Спасибо, чуть попозже попробую прикрутить, о результатах напишу.


Название: Re: калькулятор
Отправлено: Alexu007 от Май 08, 2013, 17:17
Чё то не получается. Я в заголовочный файл всё вписал, и в файл widget.cpp вставил следующую функцию:

Код
C++ (Qt)
bool Widget::eventFilter(QObject *obj, QEvent *event)
   {
 
   ui->lineEdit->setText("Yess");
 
   return  QObject::eventFilter(obj, event);
   }
 

Как я понимаю, эта функция должна вызываться при каких-то событиях, и при нажатия клавиш в т.ч. Но она не вызывается. И ещё - я не понял, куда вставлять вот это:

// установка фильтра в любой виджет
виджетУКоторогоНадоПерехватывать->installEventFilter(виджетУКоторогоИмеетсяФункцияEventFilter)

нужно, чтобы нажатия клавиш перехватывались везде: и когда фокус на форме, и на кнопках, и на lineEdit, а больше там ничего нет.



Название: Re: калькулятор
Отправлено: Bepec от Май 08, 2013, 18:13
Тогда узнай же о великом и гениальном grabKeyboard().
Будучи вызванным у виджета, он будет перехватывать все без исключения нажатия клавиш.

Т.е. алгоритм - вызвать grabKeyboard() и установить фильтр тому же виджету.


Название: Re: калькулятор
Отправлено: GreatSnake от Май 08, 2013, 19:18
нужно, чтобы нажатия клавиш перехватывались везде: и когда фокус на форме, и на кнопках, и на lineEdit, а больше там ничего нет.
Прогон всех событий приложения через this:
Код
C++ (Qt)
qApp->installEventFilter( this );


Название: Re: калькулятор
Отправлено: Alexu007 от Май 08, 2013, 19:41
Прогон всех событий приложения через this:
Код
C++ (Qt)
qApp->installEventFilter( this );
Я новичок в Qt и многого там не понимаю. Калькулятор был написан мной сперва в билдере, но я и там особо в детали не вдавался: получил обработчик прерывания кнопки и пиши туда код. А потом сделал примерно то же самое в Qt.

Прогон всех событий - это прекрасно. Судя по названию, это установка фильтра событий но куда его конкретно вставлять то?


Название: Re: калькулятор
Отправлено: kambala от Май 08, 2013, 19:51
в конструктор


Название: Re: калькулятор
Отправлено: Alexu007 от Май 09, 2013, 01:03
Ругается на строчку:

Код
C++ (Qt)
QKeyEvent *keyEvent = qobject_cast <QKeyEvent *>(event);


ошибка: no matching function for call to 'qobject_cast(QEvent*&)'


Название: Re: калькулятор
Отправлено: Bepec от Май 09, 2013, 08:59
Эт уже моя ошибка.
Там static_cast я использую ;) Извиняюсь.

PS наверно dynamic_cast тут будет вернее. Меня поправят, я думаю.


Название: Re: калькулятор
Отправлено: Alexu007 от Май 09, 2013, 14:26
Эт уже моя ошибка.
Там static_cast я использую ;) Извиняюсь.
PS наверно dynamic_cast тут будет вернее. Меня поправят, я думаю.
Ну, кто виноват - ясно. А чё делать то?


Название: Re: калькулятор
Отправлено: Bepec от Май 09, 2013, 14:41
Маразм... Заменить qobject_cast на static_cast.


Название: Re: калькулятор
Отправлено: Alexu007 от Май 09, 2013, 16:30
Маразм... Заменить qobject_cast на static_cast.
Извините чайника.

QKeyEvent *keyEvent = qobject_cast <QKeyEvent *>(event);

Я понимаю, что мы создаём ссылку на класс (да?) и заполняем этот класс значениями с помощью функции qobject_cast <QKeyEvent *>(event);

Но что это за функция - за гранью моего понимания. Почему qobject_cast, почему <QKeyEvent *> в угловых скобках, зачем в конце (event)? Я не понимаю, и не понимаю, откуда эту информацию можно взять. Я порыл в справке класс QKeyEvent, но там нет ничего о том, как заполнять его данными. Только, как извлекать информацию, например keyEvent->text(), или keyEvent->key().


Название: Re: калькулятор
Отправлено: Alexu007 от Май 09, 2013, 16:35
  static_cast работает. dynamic_cast тоже работает. Статическое связывание и динамическое связывание - что это такое и в чём разница?


Название: Re: калькулятор
Отправлено: kambala от Май 09, 2013, 20:20
тут достаточно статик каста.

отличия кастов, а также что это такое в принципе, гуглятся с неимоверной лёгкостью, раз уж не столкнулся с этой темой во время изучения плюсов.


Название: Re: калькулятор
Отправлено: Alexu007 от Май 10, 2013, 10:13
Я не изучал плюсы. Посоветуйте хороший учебник по Qt.

Прога заработала, вот функция обработки клавиатуры:

Код
C++ (Qt)
//обработка прерываний клавиатуры
bool Widget::eventFilter(QObject *obj, QEvent *event)
   {
 
   if (event->type() == QEvent::KeyPress) // /*&& obj->objectName() == "Имя виджета"*/)
       {
       static int i;
 
       if (i != 0) {i = 0; return  QObject::eventFilter(obj, event);}
 
       QKeyEvent *keyEvent = static_cast <QKeyEvent *>(event);
 
       i = keyEvent->key();
 
       if ((i > 47) && (i < 58)  ) fnDigit(i - 48);    //цифры
 
       if (i == 43) fnAction(1);   //+
       if (i == 45) fnAction(2);   //-
       if (i == 42) fnAction(3);   //*
       if (i == 47) fnAction(4);   ///
 
       if (i == 16777220) Widget::MyEventHandler3();   //Enter
       if (i == 16777221) Widget::MyEventHandler3();   //Enter
 
       if (i == 16777216) Widget::MyEventHandler4();   //Esc = C
       if (i == 16777232) Widget::MyEventHandler4();   //Home = C
 
       if (i == 16777233) Widget::MyEventHandler5();   //End = SE
       if (i == 16777238) Widget::MyEventHandler6();   //PgUp = Sqrt
       if (i == 16777239) Widget::MyEventHandler7();   //PgDn = %
       if (i == 16777249) Widget::MyEventHandler9();   //Ctrl = +/-
 
       if (i == 46)       Widget::MyEventHandler8();   //"."
 
       //тут можно посмотреть коды клавиш
       //ui->lineEdit->setText(QString::number(i));
       }
 
   return  QObject::eventFilter(obj, event);
   }

И исходники с обработкой клавиш:


Название: Re: калькулятор
Отправлено: kambala от Май 10, 2013, 13:43
Я не изучал плюсы. Посоветуйте хороший учебник по Qt.
пацан к успеху шел


Название: Re: калькулятор
Отправлено: thechicho от Май 10, 2013, 15:22
http://www.lektorium.tv/course/?id=22825 (http://www.lektorium.tv/course/?id=22825) Основы C++, 1 семестр
http://www.lektorium.tv/course/?id=22858 (http://www.lektorium.tv/course/?id=22858) Основы C++, 2 семестр

Лектор: Евгений Линский


Название: Re: калькулятор
Отправлено: Alexu007 от Май 12, 2013, 07:12
Прикрутил дополнительную фичу, так прикольней и даже удобнее. Работает и с мышкой и с клавиатурой. На этом работу над калькулятором прекращаю, дарю свой гениальный код благодарным потомкам:

(http://i081.radikal.ru/1305/b0/7cccbc9d5923.jpg)


Название: Re: калькулятор
Отправлено: Bepec от Май 12, 2013, 09:48
Я б советовал его оптимизировать :) Но дай бог.


Название: Re: калькулятор
Отправлено: thechicho от Май 12, 2013, 10:04
//дарю свой гениальный код благодарным потомкам
скромненько :D


Название: Re: калькулятор
Отправлено: Alexu007 от Май 12, 2013, 11:24
Я б советовал его оптимизировать :) Но дай бог.
А что там можно оптимизировать?

скромненько :D
Да прочитал на каком-то форуме буквально: "допустим, вы захотели выложить свой гениальный код (а другого мы не пишем!!!)..." - понравилось...  ;D