c++实现带界面简单计算器
说明
- 编辑器使用vs2010,界面设计采用qt4.8.6
- 本计算器只简单实现带括号的四则运算
界面部分
采用qt直接拖拽,设计如下
相关代码
几乎是自动生成
#ifndef UI_MYCLASS_H
#define UI_MYCLASS_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QHeaderView>
#include <QtGui/QLabel>
#include <QtGui/QLineEdit>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QPushButton>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MyClassClass
{
public:
QWidget *centralWidget;
QVBoxLayout *verticalLayout;
QLabel *label;
QLineEdit *line;
QGridLayout *gridLayout;
QPushButton *btn1;
QPushButton *btn2;
QPushButton *btn3;
QPushButton *btn4;
QPushButton *btn5;
QPushButton *btn6;
QPushButton *btn7;
QPushButton *btn8;
QPushButton *btn9;
QPushButton *btn0;
QPushButton *btnend;
QPushButton *btnclear;
QPushButton *btnl;
QPushButton *btnr;
QPushButton *btnadd;
QPushButton *btnminus;
QPushButton *btn;
QPushButton *btnmul;
QPushButton *btndivide;
QMenuBar *menuBar;
QToolBar *mainToolBar;
QStatusBar *statusBar;
void setupUi(QMainWindow *MyClassClass)
{
if (MyClassClass->objectName().isEmpty())
MyClassClass->setObjectName(QString::fromUtf8("MyClassClass"));
MyClassClass->resize(377, 385);
centralWidget = new QWidget(MyClassClass);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
verticalLayout = new QVBoxLayout(centralWidget);
verticalLayout->setSpacing(6);
verticalLayout->setContentsMargins(11, 11, 11, 11);
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
label = new QLabel(centralWidget);
label->setObjectName(QString::fromUtf8("label"));
verticalLayout->addWidget(label);
line = new QLineEdit(centralWidget);
line->setObjectName(QString::fromUtf8("line"));
verticalLayout->addWidget(line);
gridLayout = new QGridLayout();
gridLayout->setSpacing(6);
gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
btn1 = new QPushButton(centralWidget);
btn1->setObjectName(QString::fromUtf8("btn1"));
gridLayout->addWidget(btn1, 0, 0, 1, 1);
btn2 = new QPushButton(centralWidget);
btn2->setObjectName(QString::fromUtf8("btn2"));
gridLayout->addWidget(btn2, 0, 1, 1, 1);
btn3 = new QPushButton(centralWidget);
btn3->setObjectName(QString::fromUtf8("btn3"));
gridLayout->addWidget(btn3, 0, 2, 1, 1);
btn4 = new QPushButton(centralWidget);
btn4->setObjectName(QString::fromUtf8("btn4"));
gridLayout->addWidget(btn4, 1, 0, 1, 1);
btn5 = new QPushButton(centralWidget);
btn5->setObjectName(QString::fromUtf8("btn5"));
gridLayout->addWidget(btn5, 1, 1, 1, 1);
btn6 = new QPushButton(centralWidget);
btn6->setObjectName(QString::fromUtf8("btn6"));
gridLayout->addWidget(btn6, 1, 2, 1, 1);
btn7 = new QPushButton(centralWidget);
btn7->setObjectName(QString::fromUtf8("btn7"));
gridLayout->addWidget(btn7, 2, 0, 1, 1);
btn8 = new QPushButton(centralWidget);
btn8->setObjectName(QString::fromUtf8("btn8"));
gridLayout->addWidget(btn8, 2, 1, 1, 1);
btn9 = new QPushButton(centralWidget);
btn9->setObjectName(QString::fromUtf8("btn9"));
gridLayout->addWidget(btn9, 2, 2, 1, 1);
btn0 = new QPushButton(centralWidget);
btn0->setObjectName(QString::fromUtf8("btn0"));
gridLayout->addWidget(btn0, 3, 0, 1, 1);
btnend = new QPushButton(centralWidget);
btnend->setObjectName(QString::fromUtf8("btnend"));
gridLayout->addWidget(btnend, 3, 1, 1, 1);
btnclear = new QPushButton(centralWidget);
btnclear->setObjectName(QString::fromUtf8("btnclear"));
gridLayout->addWidget(btnclear, 3, 2, 2, 1);
btnl = new QPushButton(centralWidget);
btnl->setObjectName(QString::fromUtf8("btnl"));
gridLayout->addWidget(btnl, 4, 0, 1, 1);
btnr = new QPushButton(centralWidget);
btnr->setObjectName(QString::fromUtf8("btnr"));
gridLayout->addWidget(btnr, 4, 1, 1, 1);
btnadd = new QPushButton(centralWidget);
btnadd->setObjectName(QString::fromUtf8("btnadd"));
gridLayout->addWidget(btnadd, 5, 0, 1, 1);
btnminus = new QPushButton(centralWidget);
btnminus->setObjectName(QString::fromUtf8("btnminus"));
gridLayout->addWidget(btnminus, 5, 1, 1, 1);
btn = new QPushButton(centralWidget);
btn->setObjectName(QString::fromUtf8("btn"));
gridLayout->addWidget(btn, 5, 2, 2, 1);
btnmul = new QPushButton(centralWidget);
btnmul->setObjectName(QString::fromUtf8("btnmul"));
gridLayout->addWidget(btnmul, 6, 0, 1, 1);
btndivide = new QPushButton(centralWidget);
btndivide->setObjectName(QString::fromUtf8("btndivide"));
gridLayout->addWidget(btndivide, 6, 1, 1, 1);
verticalLayout->addLayout(gridLayout);
MyClassClass->setCentralWidget(centralWidget);
menuBar = new QMenuBar(MyClassClass);
menuBar->setObjectName(QString::fromUtf8("menuBar"));
menuBar->setGeometry(QRect(0, 0, 377, 26));
MyClassClass->setMenuBar(menuBar);
mainToolBar = new QToolBar(MyClassClass);
mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
MyClassClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
statusBar = new QStatusBar(MyClassClass);
statusBar->setObjectName(QString::fromUtf8("statusBar"));
MyClassClass->setStatusBar(statusBar);
retranslateUi(MyClassClass);
QMetaObject::connectSlotsByName(MyClassClass);
} // setupUi
void retranslateUi(QMainWindow *MyClassClass)
{
MyClassClass->setWindowTitle(QApplication::translate("MyClassClass", "\350\256\241\347\256\227\345\231\250", 0, QApplication::UnicodeUTF8));
label->setText(QApplication::translate("MyClassClass", "\350\257\267\350\276\223\345\205\245\344\270\200\344\270\252\344\273\245#\347\273\223\345\260\276\347\232\204\347\256\227\345\274\217", 0, QApplication::UnicodeUTF8));
btn1->setText(QApplication::translate("MyClassClass", "1", 0, QApplication::UnicodeUTF8));
btn2->setText(QApplication::translate("MyClassClass", "2", 0, QApplication::UnicodeUTF8));
btn3->setText(QApplication::translate("MyClassClass", "3", 0, QApplication::UnicodeUTF8));
btn4->setText(QApplication::translate("MyClassClass", "4", 0, QApplication::UnicodeUTF8));
btn5->setText(QApplication::translate("MyClassClass", "5", 0, QApplication::UnicodeUTF8));
btn6->setText(QApplication::translate("MyClassClass", "6", 0, QApplication::UnicodeUTF8));
btn7->setText(QApplication::translate("MyClassClass", "7", 0, QApplication::UnicodeUTF8));
btn8->setText(QApplication::translate("MyClassClass", "8", 0, QApplication::UnicodeUTF8));
btn9->setText(QApplication::translate("MyClassClass", "9", 0, QApplication::UnicodeUTF8));
btn0->setText(QApplication::translate("MyClassClass", "0", 0, QApplication::UnicodeUTF8));
btnend->setText(QApplication::translate("MyClassClass", "#", 0, QApplication::UnicodeUTF8));
btnclear->setText(QApplication::translate("MyClassClass", "\345\210\240\351\231\244", 0, QApplication::UnicodeUTF8));
btnl->setText(QApplication::translate("MyClassClass", "(", 0, QApplication::UnicodeUTF8));
btnr->setText(QApplication::translate("MyClassClass", ")", 0, QApplication::UnicodeUTF8));
btnadd->setText(QApplication::translate("MyClassClass", "+", 0, QApplication::UnicodeUTF8));
btnminus->setText(QApplication::translate("MyClassClass", "-", 0, QApplication::UnicodeUTF8));
btn->setText(QApplication::translate("MyClassClass", "\350\256\241\347\256\227", 0, QApplication::UnicodeUTF8));
btnmul->setText(QApplication::translate("MyClassClass", "*", 0, QApplication::UnicodeUTF8));
btndivide->setText(QApplication::translate("MyClassClass", "/", 0, QApplication::UnicodeUTF8));
} // retranslateUi
};
namespace Ui {
class MyClassClass: public Ui_MyClassClass {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MYCLASS_H
功能方面
界面部分
相关代码
main.cpp
#include "myclass.h"
#include <QtGui/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyClass w;
w.show();
return a.exec();
}
myclass.cpp
#include "myclass.h"
#include "QMessageBox"
using namespace std;
MyClass::MyClass(QWidget *parent, Qt::WFlags flags)
: QMainWindow(parent, flags)
{
ui.setupUi(this);
connect(ui.btn,SIGNAL(clicked()),this,SLOT(Onbtn()));
connect(ui.btn1,SIGNAL(clicked()),this,SLOT(Onbtn1()));
connect(ui.btn2,SIGNAL(clicked()),this,SLOT(Onbtn2()));
connect(ui.btn3,SIGNAL(clicked()),this,SLOT(Onbtn3()));
connect(ui.btn4,SIGNAL(clicked()),this,SLOT(Onbtn4()));
connect(ui.btn5,SIGNAL(clicked()),this,SLOT(Onbtn5()));
connect(ui.btn6,SIGNAL(clicked()),this,SLOT(Onbtn6()));
connect(ui.btn7,SIGNAL(clicked()),this,SLOT(Onbtn7()));
connect(ui.btn8,SIGNAL(clicked()),this,SLOT(Onbtn8()));
connect(ui.btn9,SIGNAL(clicked()),this,SLOT(Onbtn9()));
connect(ui.btn0,SIGNAL(clicked()),this,SLOT(Onbtn0()));
connect(ui.btnadd,SIGNAL(clicked()),this,SLOT(Onbtnadd()));
connect(ui.btnminus,SIGNAL(clicked()),this,SLOT(Onbtnminus()));
connect(ui.btnmul,SIGNAL(clicked()),this,SLOT(Onbtnmul()));
connect(ui.btndivide,SIGNAL(clicked()),this,SLOT(Onbtndivide()));
connect(ui.btnend,SIGNAL(clicked()),this,SLOT(Onbtnend()));
connect(ui.btnl,SIGNAL(clicked()),this,SLOT(Onbtnl()));
connect(ui.btnr,SIGNAL(clicked()),this,SLOT(Onbtnr()));
connect(ui.btnclear,SIGNAL(clicked()),this,SLOT(Onbtnclear()));
}
MyClass::~MyClass()
{
}
template<class t>
class stack
{
private:
int data[100];
int count;
public:
void Stack();
int empty();
int full();
int get_top();
void push(t x);
void pop();
};
template<class t>
void stack<t>::Stack()
{
count=0;
}
template<class t>
int stack<t>::empty()
{
if(count==0)
return 1;
else
return 0;
}
template<class t>
int stack<t>::full()
{
if(count==100)
return 1;
else
return 0;
}
template<class t>
int stack<t>::get_top()
{
if(empty()==0)
return data[count-1];
}
template<class t>
void stack<t>::push(t x)
{
if(full()==0)
{
data[count]=x;
count++;
}
}
template<class t>
void stack<t>::pop()
{
if(empty()==0)
count--;
}
int numbers(string nu,int i)//用来判断是数字还是运算符
{
if(nu[i]>='0'&&nu[i]<='9')
return 1;
else
return 0;
}
int priority(char py)//比较运算符的优先级
{
if(py=='+'||py=='-')
return 1;
else if(py=='*'||py=='/')
return 2;
else if(py=='#')
return -1;
else if(py=='('||py==')')
return 0;
}
int calculate(string ch)//运算
{
stack<int> num;
stack<char> sym;
char character;
int number,fn;//fn用于十位以上的数字
int f=0;//用来区分符号和数字的转换的标记
int i=0;//用来遍历表达式
num.Stack();
sym.Stack();
sym.push('#');
while(sym.empty()==0)
{
if(numbers(ch,i)==1)//如果是数字
{
if(f==0)
{
num.push(ch[i]-48);
i++;
f=1;
}
else
{
fn=num.get_top()*10+ch[i]-48;
num.pop();
num.push(fn);
i++;
f=1;
}
}
else//不是数字
{
f=0;
character=sym.get_top();
if(priority(ch[i])==priority(character)&&ch[i]==')')//括号的判断
{
sym.pop();
i++;
}
else if(ch[i]=='(')
{
sym.push(ch[i]);
i++;
}
else if(priority(ch[i])==priority(character)&&ch[i]=='#')//#的判断
{
sym.pop();
}
else if(priority(ch[i])>=priority(character))//比顶优先就入栈
{
sym.push(ch[i]);
i++;
}
else//比顶差就运算
{
if(character=='-')
{
number=num.get_top();
num.pop();
number=num.get_top()-number;
num.pop();
num.push(number);
}
else if(character=='+')
{
number=num.get_top();
num.pop();
number=num.get_top()+number;
num.pop();
num.push(number);
}
else if(character=='*')
{
number=num.get_top();
num.pop();
number=num.get_top()*number;
num.pop();
num.push(number);
}
else if(character=='/')
{
number=num.get_top();
num.pop();
number=num.get_top()/number;
num.pop();
num.push(number);
}
sym.pop();
if(priority(ch[i])>priority(sym.get_top()))//只有当前遍历到的运算符比顶大时才将其入栈,并向下遍历
{
sym.push(ch[i]);
i++;
}
else
continue;
}
}
}
return num.get_top();//输出运算结果
}
int MyClass::Onbtn1()
{
expression+="1";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn2()
{
expression+="2";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn3()
{
expression+="3";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn4()
{
expression+="4";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn5()
{
expression+="5";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn6()
{
expression+="6";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn7()
{
expression+="7";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn8()
{
expression+="8";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn9()
{
expression+="9";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtn0()
{
expression+="0";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnadd()
{
expression+="+";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnminus()
{
expression+="-";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnmul()
{
expression+="*";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtndivide()
{
expression+="/";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnend()
{
expression+="#";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnl()
{
expression+="(";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnr()
{
expression+=")";
ui.line->setText(expression);
return 0;
}
int MyClass::Onbtnclear()
{
ui.line->setText("");
expression="";
return 0;
}
int MyClass::Onbtn()
{
QString line=ui.line->text();
string ch;
int c;
ch = string((const char *)line.toLocal8Bit());//将QString转化为string
c=calculate(ch);//计算
ch= to_string(static_cast<long long>(c));//将返回的int转化为string
line= QString(QString::fromLocal8Bit(ch.c_str()));//将string转化为QString
QMessageBox::information(this,"result",line);//显示结果
return 0;
}
myclass.h
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QtGui/QMainWindow>
#include "ui_myclass.h"
class MyClass : public QMainWindow
{
Q_OBJECT
public:
MyClass(QWidget *parent = 0, Qt::WFlags flags = 0);
~MyClass();
private slots:
int Onbtn();
int Onbtn1();
int Onbtn2();
int Onbtn3();
int Onbtn4();
int Onbtn5();
int Onbtn6();
int Onbtn7();
int Onbtn8();
int Onbtn9();
int Onbtn0();
int Onbtnadd();
int Onbtnminus();
int Onbtnmul();
int Onbtndivide();
int Onbtnend();
int Onbtnl();
int Onbtnr();
int Onbtnclear();
private:
Ui::MyClassClass ui;
QString expression;
};
#endif // MYCLASS_H