本人刚学Qt时实现了一个计算器的简单应用程序,刚好最近的程序设计训练有计算器这道题目,于是便完善了一下,拿出来分享给大家, 说不定有和我选一样的同学看到。
这是运行后的应用程序,由于我的电脑是Win7系统,所以我就参考Win7自带的应用计算器设计开发。
本程序参考《设计模式》将用户界面与业务逻辑分离开,并通过业务接口关联。
设计原则:功能模块之间需要进行解耦。
核心思想:强内聚,弱耦合。
1、每个模块只实现单一的功能。
2、每个模块内部只为整体的单一功能而存在。
3、模块之间通过约定好的接口进行交互。
接口类:
#ifndef _ICALCULATOR_H_
#define _ICALCULATOR_H_
#include <QString>
class ICalculator
{
public:
virtual bool expression(const QString& exp) = 0; //输入表达式
virtual QString result() = 0; //结果
};
#endif
UI界面:UI界面很多人都喜欢拖拽的方式生成,但是听老师说拖拽的方式最大的两个弊端就是代码的冗长和后期维护成本过高,而且这个界面也很简单,所有我自己写了(说实话本人不会拖拽生成界面,当初学的时候自动跳过了)。
#ifndef _QCALCULATORUI_H_
#define _QCALCULATORUI_H_
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include "ICalculator.h"
class QCalculatorUI : public QWidget
{
Q_OBJECT
private:
QLineEdit* m_edit;
QPushButton* m_buttons[24];
ICalculator* m_cal;
QCalculatorUI();
bool construct();
private slots:
void onButtonClicked();
public:
static QCalculatorUI* NewInstance();
void show();
void setCalculator(ICalculator* cal);
ICalculator* getCalculator();
~QCalculatorUI();
};
#endif
上面的的代码如果有人问,为什么构造函数要声明成保护类,而不在public中,你可以去看我的另一篇博客C++->二阶构造
https://blog.csdn.net/weixin_41477765/article/details/89459831
#include "QCalculatorUI.h"
#include <qmath.h>
#include <QDebug>
QCalculatorUI::QCalculatorUI() : QWidget(NULL, Qt::WindowCloseButtonHint)
{
m_cal = NULL;
}
bool QCalculatorUI::construct()
{
bool ret = true;
const char* btnText[24] =
{
"e^x", "7", "8", "9", "+", "(",
"sin", "4", "5", "6", "-", ")",
"cos", "1", "2", "3", "*", "<-",
"tan", "0", ".", "=", "/", "C",
};
m_edit = new QLineEdit(this);
if( m_edit != NULL )
{
m_edit->move(10, 10);
m_edit->resize(290, 30);
m_edit->setReadOnly(true); //将文本设置为只读模式
m_edit->