Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
NikitaNet
2 / 2 / 0
Регистрация: 03.01.2014
Сообщений: 38
#1

Как эффективно описать кнопки для калькулятора? - C++ Qt

10.01.2017, 01:17. Просмотров 296. Ответов 14
Метки нет (Все метки)

Доброго времени суток.
Решил написать калькулятор и столкнулся со следующей проблемой:
дабы не громоздить лишний код, создаю один слот digitClicked(), для обработки сигналов цифр.
Решил воспользоваться для этого QSignalMapper, но как потом понял, он больше применим для динамически создаваемых объектов, а у меня кнопки уже отрисованы.
В итоге все равно получилось много кода. Можно ли как-то по другому описать кнопки? Или подредактировать мой код.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    operandClicked = true;
    QSignalMapper *mapperDigit = new QSignalMapper(this);
 
    /* digits */
    mapperDigit->setMapping( ui->Button0, "0" );
    mapperDigit->setMapping( ui->Button1, "1" );
    mapperDigit->setMapping( ui->Button2, "2" );
    mapperDigit->setMapping( ui->Button3, "3" );
    mapperDigit->setMapping( ui->Button4, "4" );
    mapperDigit->setMapping( ui->Button5, "5" );
    mapperDigit->setMapping( ui->Button6, "6" );
    mapperDigit->setMapping( ui->Button7, "7" );
    mapperDigit->setMapping( ui->Button8, "8" );
    mapperDigit->setMapping( ui->Button9, "9" );
 
    connect( ui->Button0, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button1, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button2, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button3, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button4, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button5, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button6, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button7, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button8, SIGNAL(clicked()), mapper, SLOT(map()) );
    connect( ui->Button9, SIGNAL(clicked()), mapper, SLOT(map()) );
 
    connect( mapper, SIGNAL(mapped(QString)), this, SLOT(digetClicked(QString)) );
 
}
 
void MainWindow::digetClicked(const QString &s)
{
    if (ui->display->text() == "0" && s == "0") {
        return;
    }
 
    if (operandClicked) {
        ui->display->clear();
        operandClicked = false;
    }
 
    ui->display->setText(ui->display->text() + s);
}
Прошу вашей помощи. Заранее благодарю.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2017, 01:17     Как эффективно описать кнопки для калькулятора?
Посмотрите здесь:

Как эффективно рисовать 100500 графиков функций, позволяя пользователю отключать любой из них? - C++ Qt
100500 графиков мне рисовать не надо, достаточно 30-50 штук. Да и не графики мне вовсе нужны, а просто многоугольник из n вершин, где n = ....

Как в своей программе назначить код для кнопки в рантайме - C++ Qt
Вот в QtDesigner бросаем на форму кнопку, дважды кликаем по ней и можно изменить текст Как сделать что-то подобное в своей программе,...

Калькулятор из двух полей для ввода текста, кнопки для выполнения арифметического действия и текстовой строки - C++ Qt
Постановка задачи: \ Создайте калькулятор из двух полей для ввода текста, кнопки для выполнения арифметического действия и текстовой...

Описать метод contains для проверки попадания курсора в данный полигон - C++ Qt
Ребята, не могу описать метод contains для poly. Чтобы нажимая на экран высвечивалась надписать, попадает в полигон или нет. Вот сама...

Слот для замены кнопки на изображение - C++ Qt
Как сделать слот для кнопки,чтоб при нажатии на эту кнопку она заменялась на изображение мое. Вот у меня есть кнопка p1,чтоб просто...

рамка для правой стороны кнопки - C++ Qt
Всем привет. Есть класс унаследованный от класса QPushButton. Я пытаюсь при помощи метода setStyleSheet() установить цвет для правой части...

Реализация калькулятора в Qt - C++ Qt
Ребят, помогите ,пожалуйста! Необходимо ( к моему великому сожалению!) сделать нечто похожее на калькулятор. С простыми функциям (т.е....

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
Эксперт C
15686 / 10013 / 1504
Регистрация: 24.12.2010
Сообщений: 18,815
10.01.2017, 02:30     Как эффективно описать кнопки для калькулятора? #2
NikitaNet, Тогда лучше создавать кнопки динамически
C++ (Qt)
1
2
3
4
5
6
7
QPushButttton butts[10];
for(int i=0; i<10; i++) {
  butts[i] = new QPushButton(QString(i));
  // причалить ее к Лайоуту
 mapperDigit->setMapping( butts[i], QString(i));
 connect( butts[i], SIGNAL(clicked()), mapper, SLOT(map()));  
}
Добавлено через 4 минуты
Можно еще все кнопки сконнектить на один слот. В этом слоте по sender определять кнопку, текст на ней и генерить соответствующую цифру. Тогда и mapperDigit не нужен.
NikitaNet
2 / 2 / 0
Регистрация: 03.01.2014
Сообщений: 38
10.01.2017, 02:40  [ТС]     Как эффективно описать кнопки для калькулятора? #3
Цитата Сообщение от Байт Посмотреть сообщение
Тогда лучше создавать кнопки динамически
Проблема в том, что кнопки уже отрисованы в редакторе и подогнаны, не хочется их заново создавать

Цитата Сообщение от Байт Посмотреть сообщение
В этом слоте по sender определять кнопку, текст на ней и генерить соответствующую цифру
Это примерно так получится?
C++ (Qt)
1
2
3
4
5
6
QPushButton* btn;
    
btn = qobject_cast<QPushButton*>( sender());
QString str = ui->Result->text() + btn->text();
 
ui->Result->setText(str);
Байт
Эксперт C
15686 / 10013 / 1504
Регистрация: 24.12.2010
Сообщений: 18,815
10.01.2017, 02:42     Как эффективно описать кнопки для калькулятора? #4
Цитата Сообщение от NikitaNet Посмотреть сообщение
Это примерно так получится?
Да, похоже.
Цитата Сообщение от NikitaNet Посмотреть сообщение
кнопки уже отрисованы в редакторе и подогнаны, не хочется их заново создавать
Тогда мучайся
NikitaNet
2 / 2 / 0
Регистрация: 03.01.2014
Сообщений: 38
10.01.2017, 02:57  [ТС]     Как эффективно описать кнопки для калькулятора? #5
Байт, а нельзя ли как-то через цикл вот это сделать, если динамически не создавать?
C++ (Qt)
1
2
3
4
mapperDigit->setMapping( ui->Button1, "1" );
mapperDigit->setMapping( ui->Button2, "2" );
mapperDigit->setMapping( ui->Button3, "3" );
...
Я долго мучился, но так ничего и не придумал
Байт
Эксперт C
15686 / 10013 / 1504
Регистрация: 24.12.2010
Сообщений: 18,815
10.01.2017, 03:53     Как эффективно описать кнопки для калькулятора? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от NikitaNet Посмотреть сообщение
Я долго мучился, но так ничего и не придумал
Мучайся дальше. Тут мешает то, что Button1 ... - Имена. Воцикливанию не поддающиеся.
Можно, конечно нарисовать опять же
C++ (Qt)
1
2
3
4
 QPushButttton *butts[10];  // В моем посте 2 тут ошибочка
 butts[0] = ui->Button0;
 butts[1] = ui->Button1;
 ...
Но особого облегчения, глядя на этот код, я не испытываю.

Добавлено через 4 минуты
Есть еще идейка давать твоим батонам имена (objectName) - не знаю, наверное в Designer это можно, типа "0", "1" ... и вытаскивать их по findChild.

Добавлено через 2 минуты
Тут такая штука. Форморшлепство тебя избавляет от программирования, но когда тебе охота попрограммировать - дудки!
NikitaNet
2 / 2 / 0
Регистрация: 03.01.2014
Сообщений: 38
10.01.2017, 05:36  [ТС]     Как эффективно описать кнопки для калькулятора? #7
Цитата Сообщение от Байт Посмотреть сообщение
Есть еще идейка давать твоим батонам имена (objectName) - не знаю, наверное в Designer это можно, типа "0", "1" ... и вытаскивать их по findChild
Спасибо! Буду думать

Добавлено через 57 минут
Байт, у меня примерно такая конструкция получилась.
C++ (Qt)
1
2
3
4
5
for(int i=0; i<10; i++) {
    button[i] = parent->findChild<QToolButton *>("Button" + QString::number(i));
    mapperDigit->setMapping( button[i],  QString::number(i));
    connect( button[i], SIGNAL(clicked()), mapperDigit, SLOT(map()) );
}
Но боюсь, что я не до конца разобрался с findChild, так как она не работает
trdm
173 / 27 / 5
Регистрация: 29.01.2013
Сообщений: 166
10.01.2017, 07:34     Как эффективно описать кнопки для калькулятора? #8
Цитата Сообщение от NikitaNet Посмотреть сообщение
Я долго мучился, но так ничего и не придумал
У Земскова есть пример калькулятора.
NikitaNet
2 / 2 / 0
Регистрация: 03.01.2014
Сообщений: 38
10.01.2017, 14:34  [ТС]     Как эффективно описать кнопки для калькулятора? #9
\
Цитата Сообщение от trdm Посмотреть сообщение
У Земскова есть пример калькулятора.
Не подскажите в какой части, а то в readme ничего не нашел?
alexu_007
109 / 114 / 28
Регистрация: 29.05.2015
Сообщений: 854
10.01.2017, 16:07     Как эффективно описать кнопки для калькулятора? #10
Я вот так реализовал клик мышкой по кнопкам калькулятора:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// обработчик кликов мышой по кнопкам калькулятора
void Widget::Press_Any_Keys()
{
 
    QString str = sender()->objectName();
    int x = str.remove(0, 11).toInt();
 
    if(x < 10) {fnDigit(x); return;}
    if(x < 14) {fnAction(x-9); return;}
 
    if(x == 14) {Press_Enter_Key(); return;}
    if(x == 15) {Press__Esc__Key(); return;}
    if(x == 16) {Press___CE__Key(); return;}
    if(x == 17) {Press_SQRT__Key(); return;}
    if(x == 18) {Press_PRCNT_Key(); return;}
    if(x == 19) {Press_Point_Key(); return;}
    if(x == 20) {Press_Minus_Key(); return;}
 
}
Wyn
Модератор
995 / 576 / 216
Регистрация: 14.01.2016
Сообщений: 1,913
Записей в блоге: 9
10.01.2017, 16:40     Как эффективно описать кнопки для калькулятора? #11
В Qt есть пример калькулятора. Чем не устраивает?
trdm
173 / 27 / 5
Регистрация: 29.01.2013
Сообщений: 166
11.01.2017, 09:03     Как эффективно описать кнопки для калькулятора? #12
Цитата Сообщение от NikitaNet Посмотреть сообщение
Не подскажите в какой части, а то в readme ничего не нашел?
Извините, вот:
Вложения
Тип файла: 7z calculator2.7z (5.4 Кб, 2 просмотров)
Байт
Эксперт C
15686 / 10013 / 1504
Регистрация: 24.12.2010
Сообщений: 18,815
11.01.2017, 11:52     Как эффективно описать кнопки для калькулятора? #13
Цитата Сообщение от trdm Посмотреть сообщение
У Земскова есть пример
Сколь бы не был хорош калькулятор у Земскова (а я к этому автору отношусь с большим уважением), но ИМХО, цель ТС не заполучить себе хороший калькуляторов (их пруд пруди, так как калькулятор - хороший пример, и не очень сложный, и делающий какую-то полезную работу), а научиться кой-чему. И увидев некий однообразный код, он, как нормальный программист, захотел реализовать его компактно, то есть в цикле. Но начав работу в духе "формошлепства" (я не придаю этому термину отрицательной окраски), обнаружил, что этот подход несколько стреножит программирование. И дилемма в том, что надо решить - пытаться ли бежать дальше со спутанными ногами (хотя и очень симпатичными веревочками) или всетки иногда создавать свои виджетики динамически. Как дальше скакать - ему решать. Тем более, что какой-то опыт у него уже появляется.
Возможно, я и ошибаюсь в истинных намерениях ТС, но подобная проблема вставала и передо мной.
Кстати, у Земкова тоже все создается динамически, Designer-ом там и не пахнет.
alexu_007
109 / 114 / 28
Регистрация: 29.05.2015
Сообщений: 854
11.01.2017, 16:28     Как эффективно описать кнопки для калькулятора? #14
Цитата Сообщение от Байт Посмотреть сообщение
Но начав работу в духе "формошлепства" (я не придаю этому термину отрицательной окраски), обнаружил, что этот подход несколько стреножит программирование. И дилемма в том, что надо решить - пытаться ли бежать дальше со спутанными ногами (хотя и очень симпатичными веревочками) или всетки иногда создавать свои виджетики динамически.
Создавать динамически - выигрываешь в том, что сразу получаешь адреса созданных объектов, можешь сохранить их в контейнер, и в дальнейшем обращаться к объекту не по имени, а по позиции в контейнере. Допустим, активировать случайную кнопку на форме - не из сотни "pushButton_00 - pushButton_99", а что-то вроде list_Pbtns.at(50)->setVisible(true);

На этом преимущества заканчиваются. Минусы - нужно программно устанавливать положение каждой кнопки, размер, текст на ней и т.д. Хорошо, если расположение регулярное, и размер одинаковый, а если нет? Как раз то, что легко и наглядно сделать визуально - да ещё и результат сразу видишь - красиво, некрасиво, криво, ровно и т.д. А получить адреса установленных "формошлёпством" объектов можно с помощью findChildren.
Миниатюры
Как эффективно описать кнопки для калькулятора?  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2017, 17:11     Как эффективно описать кнопки для калькулятора?
Еще ссылки по теме:

Интерфейс калькулятора - C++ Qt
Здравствуйте. Помогите создать интерфейс калькулятора, без сигнальных связей, просто интерфейс, вручную

Дисплей калькулятора - C++ Qt
Всем привет! Найдите пожалуйста мою ошибку, не могу вывести экран. Спасибо! # include &lt;QApplication&gt; # include &lt;QSizePolicy&gt; #...

Создание калькулятора - C++ Qt
Нужно написать калькулятор в QT. 1:строка под число. 2:строка под число. 3:строка + - * : 4 :Вывод.

Создание кнопки в qml для enable/disable - C++ Qt
Здравствуйте, извиняюсь за вопрос сразу. Необходимо создать кнопу, чтобы щелкая по ней ставилась либо убиралась галка в qml, и вызывалось...

Как описать struct в классе? - C++ Qt
Описать структуру типа &quot;Точка в пространстве&quot; и класс &quot;Прямая в пространстве&quot;, В частности: &quot;Точка&quot; содержит поля X, Y, Z -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Байт
Эксперт C
15686 / 10013 / 1504
Регистрация: 24.12.2010
Сообщений: 18,815
11.01.2017, 17:11     Как эффективно описать кнопки для калькулятора? #15
Цитата Сообщение от alexu_007 Посмотреть сообщение
На этом преимущества заканчиваются
Не согласен. Все зависит от поставленных целей. Если цель - сделать легко модифицируемую программу, то динамика вкупе с лайоутами и стилями позволяет творить чудеса. Если во главу угла ставится дизайн, тогда да. Формошлепство для того и было придумано. Впрочем, никто не запрещает комбинировать оба подхода.

Добавлено через 5 минут
PS. Вашу красивую картинку можно сделать и динамически. И по времени разработки сильно отличаться не будет. Но в Designer придется делать много однообразных скушных действий. Зато ручками придется думать головой. И тут - кому что больше нравится
Yandex
Объявления
11.01.2017, 17:11     Как эффективно описать кнопки для калькулятора?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru