Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] В помощь новичку


Автор: scorpion9 26.10.2009, 09:50
Добрый день! Недавно начал изучать QT(до этого программил только на Delphi немного). Щас аот решил создать калькулятор,но... Хотелось бы сделать его не одним текстом писанным))))) а с помощью собственноручно поставленных на форму кнопок и полей. я все конечно расставил,прописал слоты на кнопки... конечно же цифры у меня добавляются по одному...)))))). вот собственно вопрос: как дальше быть? что и куда писать? подскажите кто чем сможет...

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

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

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

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


Автор: SABROG 26.10.2009, 12:06
А пример examples\widgets\calculator\ изучил?

Автор: scorpion9 26.10.2009, 14:18
Пример то я изучил... Но мне хотелось бы сделать как то наподобие в Delphi. т.е. ставишь на форму кнопки в ручную, потом уже писать их действия и т.п. но вот не получается,однако... что куда писать... smile 

Автор: SABROG 26.10.2009, 15:30
Цитата(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 : {
...
    }
}


И т.д.

Автор: graham 26.10.2009, 15:53
Видимо ты торопишься, раз не понимаешь. Хорошо разберись с сигналами и слотами. После Delphi и MS VS я и сам не сразу понял что как. Первые две главы Бланшета "QT4. Программирование GUI на C++" и чтение примеров, идущих с QT, для меня прояснили эту "проблему".

Автор: scorpion9 27.10.2009, 15:08
люди,написал я пробный свой калк... но вот что то в 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();
}



Автор: scorpion9 27.10.2009, 15:09
да,кстати, ошибка представлена в изображении...

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

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

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

Автор: gmorgunov 30.10.2009, 22:31
Вот исходники из книги Шлее, попроще чем у Бланшетт:
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 все  работает.

Автор: JackYF 31.10.2009, 13:57

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

Автор: scorpion9 3.11.2009, 10:12
извините, невнимательность)))))))))))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)