Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] В помощь новичку, создание калькулятора 
:(
    Опции темы
scorpion9
Дата 26.10.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Добрый день! Недавно начал изучать QT(до этого программил только на Delphi немного). Щас аот решил создать калькулятор,но... Хотелось бы сделать его не одним текстом писанным))))) а с помощью собственноручно поставленных на форму кнопок и полей. я все конечно расставил,прописал слоты на кнопки... конечно же цифры у меня добавляются по одному...)))))). вот собственно вопрос: как дальше быть? что и куда писать? подскажите кто чем сможет...
PM MAIL   Вверх
graham
Дата 26.10.2009, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Цитата(scorpion9 @ 26.10.2009,  09:50)
вот собственно вопрос: как дальше быть? что и куда писать? подскажите кто чем сможет...

Слишком глобально спрашиваете. Сначало сами определитсь "как дальше быть? что ... писать?", а вот потом уже "как и куда", если возникнут трудности, спрашивать тут.

Это сообщение отредактировал(а) graham - 26.10.2009, 10:51
PM MAIL   Вверх
GLeBaTi
Дата 26.10.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

Репутация: нет
Всего: 0



У меня есть исходник программы, которая вычисляет выражение введенное на экран (т.е. пишешь строку: "2+2" оно выводит "4") только на C# 

ты можешь в своей проге нажимать на кнопочки, тем самым генерируется строка(пример: нажимаешь кнопки: [1][+][2] вызывается ф-ия возвращающая строку "1+2", затем эта строка передается ф-ии, которая уже вычисляет, и выводит ответ)


PM MAIL   Вверх
SABROG
Дата 26.10.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



А пример examples\widgets\calculator\ изучил?


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
scorpion9
Дата 26.10.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Пример то я изучил... Но мне хотелось бы сделать как то наподобие в Delphi. т.е. ставишь на форму кнопки в ручную, потом уже писать их действия и т.п. но вот не получается,однако... что куда писать... smile 
PM MAIL   Вверх
SABROG
Дата 26.10.2009, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(scorpion9 @  26.10.2009,  09:50 Найти цитируемый пост)
я все конечно расставил,прописал слоты на кнопки... 


Тут достаточно одного слота на самом деле и QButtonGroup. А далее заводишь enum, где перечисляешь возможные кнопки. Проставляешь через QButtonGroup::setId() айдишники из enum'a. Далее в слоте на сигнал QButtonGroup::buttonClicked(int id) вызываешь QAbstractButton * QButtonGroup::button(int id), заводишь switch(id) и прописываешь варианты из enum'a, затем в эти блоки пихаешь нечто подобное, что содержится в слотах в Qtшном примере. Т.е. это:

Код

void Calculator::digitClicked()
{
    Button *clickedButton = qobject_cast<Button *>(sender());
    int digitValue = clickedButton->text().toInt();
    if (display->text() == "0" && digitValue == 0.0)
        return;

    if (waitingForOperand) {
        display->clear();
    waitingForOperand = false;
    }
    display->setText(display->text() + QString::number(digitValue));



на это:

Код

enum Calc {digit, unary, additive, multiplicative, equal ...}
...
switch(id) {
    case Calc::digit : {
        QAbstractButton *clickedButton = ui->buttonGroup->button(id);
        int digitValue = clickedButton->text().toInt();
        if (display->text() == "0" && digitValue == 0.0)
        return;

        if (waitingForOperand) {
            display->clear();
            waitingForOperand = false;
        }
        display->setText(display->text() + QString::number(digitValue));
    }
    case Calc::unary : {
...
    }
}


И т.д.

Это сообщение отредактировал(а) SABROG - 26.10.2009, 15:32


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
graham
Дата 26.10.2009, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 17.4.2009

Репутация: нет
Всего: нет



Видимо ты торопишься, раз не понимаешь. Хорошо разберись с сигналами и слотами. После Delphi и MS VS я и сам не сразу понял что как. Первые две главы Бланшета "QT4. Программирование GUI на C++" и чтение примеров, идущих с QT, для меня прояснили эту "проблему".
PM MAIL   Вверх
scorpion9
Дата 27.10.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



люди,написал я пробный свой калк... но вот что то в main.cpp ругается. ниже привожу код и ошибки.
#include <QtGui/QApplication>
#include "calculator.h"

Код

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Calculator calculator;
    calculator.resize(230,200);
    calculator.show();
    return app.exec();
}




Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  1.jpg 17,22 Kb
PM MAIL   Вверх
scorpion9
Дата 27.10.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



да,кстати, ошибка представлена в изображении...

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  1.jpg 17,22 Kb
PM MAIL   Вверх
scorpion9
Дата 30.10.2009, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



Ну кто что может сказать? пример подобный с книги переписывал... те же ошибки? может при создании проекта я что то не так делаю?  smile 
PM MAIL   Вверх
SABROG
Дата 30.10.2009, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(scorpion9 @ 30.10.2009,  15:55)
Ну кто что может сказать? пример подобный с книги переписывал... те же ошибки? может при создании проекта я что то не так делаю?  smile

В файле foo.cpp на 39 строке ошибка, а файл bar.h вообще не в той папке лежит...


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
gmorgunov
Дата 30.10.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: нет
Всего: 5



Вот исходники из книги Шлее, попроще чем у Бланшетт:
Calculator.h
Код

#ifndef _Calculator_h_
#define _Calculator_h_

#include <QWidget>
#include <QStack>

class QLCDNumber;
class QPushButton;

// ======================================================================
class Calculator : public QWidget {
    Q_OBJECT
private:
    QLCDNumber*     m_plcd;
    QStack<QString> m_stk;

public:
    Calculator(QWidget* pwgt = 0);

    QPushButton* createButton(const QString& str);
    void         calculate   (                  );

public slots:
    void slotButtonClicked();
};

#endif  //_Calculator_h_

Calculator.cpp
Код

#include <QtGui>
#include "Calculator.h"

// ----------------------------------------------------------------------
Calculator::Calculator(QWidget* pwgt/*= 0*/) : QWidget(pwgt)
{
    m_plcd = new QLCDNumber(12);
    m_plcd->setSegmentStyle(QLCDNumber::Flat);
    m_plcd->setMinimumSize(150, 50);

    QChar aButtons[4][4] = {{'7', '8', '9', '/'},
                            {'4', '5', '6', '*'},
                            {'1', '2', '3', '-'},
                            {'0', '.', '=', '+'}
                           };

    //Layout setup
    QGridLayout* ptopLayout = new QGridLayout;
    ptopLayout->addWidget(m_plcd, 0, 0, 1, 4);    
    ptopLayout->addWidget(createButton("CE"), 1, 3);

    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
           ptopLayout->addWidget(createButton(aButtons[i][j]), i + 2, j);
        }
    }
    setLayout(ptopLayout);
}

// ----------------------------------------------------------------------
QPushButton* Calculator::createButton(const QString& str)
{
    QPushButton* pcmd = new QPushButton(str);
    pcmd->setMinimumSize(40, 40);
    connect(pcmd, SIGNAL(clicked()), SLOT(slotButtonClicked()));
    return pcmd;
}


// ----------------------------------------------------------------------
void Calculator::calculate()
{
    double  dOperand2    = m_stk.pop().toDouble();
    QString strOperation = m_stk.pop();
    double  dOperand1    = m_stk.pop().toDouble();
    double  dResult      = 0;

    if (strOperation == "+") {
        dResult = dOperand1 + dOperand2;
    }
    if (strOperation == "-") {
        dResult = dOperand1 - dOperand2;
    }
    if (strOperation == "/") {
        dResult = dOperand1 / dOperand2;
    }
    if (strOperation == "*") {
        dResult = dOperand1 * dOperand2;
    }
    m_plcd->display(dResult);
}

// ----------------------------------------------------------------------
void Calculator::slotButtonClicked()
{
    QString str = ((QPushButton*)sender())->text();

    if (str == "CE") {
        m_stk.clear();
        m_plcd->display("0");
        return;
    }
    if (str.contains(QRegExp("[0-9]"))) {
        str = QString().setNum(m_plcd->value()) + str;
        m_plcd->display(str.toDouble());
    }
    else {
        if (m_stk.count() >= 2) {
            m_stk.push(QString().setNum(m_plcd->value()));
            calculate();
            m_stk.clear();
            m_stk.push(QString().setNum(m_plcd->value()));
            if (str != "=") {
                m_stk.push(str);
            }
        }
        else {
            m_stk.push(QString().setNum(m_plcd->value()));
            m_stk.push(str);
            m_plcd->display(0);
        }
    }
}

main.cpp
Код

#include <QApplication>
#include "Calculator.h"

// ----------------------------------------------------------------------
int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Calculator   calculator;

    calculator.setWindowTitle("Calculator");
    calculator.resize(230, 200);

    calculator.show(); 

    return app.exec();
}

Собирай qmake -project; qmake; make
У меня в SUSE11.1 все  работает.
PM MAIL   Вверх
JackYF
Дата 31.10.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162




M
JackYF
scorpion9, пользуйся кнопкой "Код", ошибки компилятора выкладывай в текстовом виде.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
scorpion9
Дата 3.11.2009, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.10.2009

Репутация: нет
Всего: нет



извините, невнимательность)))))))))))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0893 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.