Qt Script之calculator
简易计算器主要有数字,一元操作符,二元操作符,和memory操作
初始状态等待输入操作数,若输入的是运算符得到的运算结果依然是0.若输入的是数字则显示出来
并将等待操作数设置为false,下次若还是数字则直接添加到后面如果是一元运算符则直接得出结果
显示出来,若是二元运算符则分别用sumSoFar(记录加减操作数),factorSoFar(记录乘除操作数)和用
pendingAdditiveOperator(加减),pendingMultiplicativeOperator(乘除)运算符并设置等待操作数为true
//main.cpp
int main(int argc, char **argv)
{
Q_INIT_RESOURCE(calculator);//初始化资源
QApplication app(argc, argv);
//! [0a]
QScriptEngine engine;//JS引擎解释执行JS代码
//! [0a]
//JS调试窗口
if !defined(QT_NO_SCRIPTTOOLS)
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
QMainWindow *debugWindow = debugger.standardWindow();
debugWindow->resize(, );
//debugWindow->show();
endif
//! [0b] 加载JS代码
QString scriptFileName(":/calculator.js");
QFile scriptFile(scriptFileName);
scriptFile.open(QIODevice::ReadOnly);
engine.evaluate(scriptFile.readAll(), scriptFileName);
scriptFile.close();
//! [0b]
//! [1]加载界面UI文件
QUiLoader loader;
QFile uiFile(":/calculator.ui");
uiFile.open(QIODevice::ReadOnly);
QWidget *ui = loader.load(&uiFile);
uiFile.close();
//! [1]
//! [2]
QScriptValue ctor = engine.evaluate("Calculator");//执行Calculator代码
QScriptValue scriptUi = engine.newQObject(ui, QScriptEngine::ScriptOwnership);//创建一个script下的UI对象
QScriptValue calc = ctor.construct(QScriptValueList() << scriptUi);//构造Calculator对象
//! [2]
if !defined(QT_NO_SCRIPTTOOLS)
QLineEdit *display = ui->findChild<QLineEdit*>("display");
QObject::connect(display, SIGNAL(returnPressed()),
debugWindow, SLOT(show()));
endif
//! [3]
ui->show();
return app.exec();
//! [3]
}
//calculator.js
Function.prototype.bind = function() {
var func = this;//this即Function
var thisObject = arguments[];//函数执行上下文
var args = Array.prototype.slice.call(arguments, );//将具有length属性的对象转成数组
return function() {
return func.apply(thisObject, args);//调用func函数
}
}
//! [0]
function Calculator(ui)
{
this.ui = ui;//获取界面
this.pendingAdditiveOperator = Calculator.NO_OPERATOR;//未决定的加法操作符
this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;//未决定的乘法操作符
this.sumInMemory = ;//记录要存储的数据
this.sumSoFar = ;//记录加减结果
this.factorSoFar = ;//记录乘除结果
this.waitingForOperand = true;//是否在等待操作数
with (ui) {
display.text = "0";
//绑定数字按钮响应函数
zeroButton.clicked.connect(this.digitClicked.bind(this, ));
oneButton.clicked.connect(this.digitClicked.bind(this, ));
twoButton.clicked.connect(this.digitClicked.bind(this, ));
threeButton.clicked.connect(this.digitClicked.bind(this, ));
fourButton.clicked.connect(this.digitClicked.bind(this, ));
fiveButton.clicked.connect(this.digitClicked.bind(this, ));
sixButton.clicked.connect(this.digitClicked.bind(this, ));
sevenButton.clicked.connect(this.digitClicked.bind(this, ));
eightButton.clicked.connect(this.digitClicked.bind(this, ));
nineButton.clicked.connect(this.digitClicked.bind(this, ));
//绑定小数点按钮响应函数
pointButton.clicked.connect(this, "pointClicked");
//绑定改变符号按钮响应函数
changeSignButton.clicked.connect(this, "changeSignClicked");
//后退按钮,清空按钮,和清空全部按钮响应函数
backspaceButton.clicked.connect(this, "backspaceClicked");
clearButton.clicked.connect(this, "clear");
clearAllButton.clicked.connect(this, "clearAll");
//清空存储,读取存储,设置存储,添加到存储按钮响应函数
clearMemoryButton.clicked.connect(this, "clearMemory");
readMemoryButton.clicked.connect(this, "readMemory");
setMemoryButton.clicked.connect(this, "setMemory");
addToMemoryButton.clicked.connect(this, "addToMemory");
//运算符按钮响应函数
divisionButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.DIVISION_OPERATOR));
timesButton.clicked.connect(this.multiplicativeOperatorClicked.bind(this, Calculator.TIMES_OPERATOR));
minusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.MINUS_OPERATOR));
plusButton.clicked.connect(this.additiveOperatorClicked.bind(this, Calculator.PLUS_OPERATOR));
squareRootButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.SQUARE_OPERATOR));
powerButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.POWER_OPERATOR));
reciprocalButton.clicked.connect(this.unaryOperatorClicked.bind(this, Calculator.RECIPROCAL_OPERATOR));
equalButton.clicked.connect(this, "equalClicked");
}
}
//! [0]
//定义运算符
Calculator.NO_OPERATOR = ;
Calculator.SQUARE_OPERATOR = ;
Calculator.POWER_OPERATOR = ;
Calculator.RECIPROCAL_OPERATOR = ;
Calculator.DIVISION_OPERATOR = ;
Calculator.TIMES_OPERATOR = ;
Calculator.MINUS_OPERATOR = ;
Calculator.PLUS_OPERATOR = ;
//中断操作函数
Calculator.prototype.abortOperation = function()
{
this.clearAll();
this.ui.display.text = "####";
}
//计算函数,参数是右操作数和运算符并且将运算结果存储到sumSoFar
Calculator.prototype.calculate = function(rightOperand, pendingOperator)
{
if (pendingOperator == Calculator.PLUS_OPERATOR) {
this.sumSoFar += rightOperand;
} else if (pendingOperator == Calculator.MINUS_OPERATOR) {
this.sumSoFar -= rightOperand;
} else if (pendingOperator == Calculator.TIMES_OPERATOR) {
this.factorSoFar *= rightOperand;
} else if (pendingOperator == Calculator.DIVISION_OPERATOR) {
if (rightOperand == )
return false;
this.factorSoFar /= rightOperand;
}
return true;
}
//! [1]
//操作数处理函数
Calculator.prototype.digitClicked = function(digitValue)
{
if ((digitValue == ) && (this.ui.display.text == "0"))//初始状态
return;
if (this.waitingForOperand) {//若等待操作数为真
this.ui.display.clear();//清空display
this.waitingForOperand = false;//设置等待操作数为false
}
this.ui.display.text += digitValue;//将操作数添加到display显示文本后面
}
//! [1]
//一元操作符处理函数
Calculator.prototype.unaryOperatorClicked = function(op)
{
var operand = this.ui.display.text - ;//获取操作数
var result = ;
if (op == Calculator.SQUARE_OPERATOR) {//开根号若操作数为负则终止操作
if (operand < ) {
this.abortOperation();
return;
}
result = Math.sqrt(operand);
} else if (op == Calculator.POWER_OPERATOR) {//平方
result = Math.pow(operand, );
} else if (op == Calculator.RECIPROCAL_OPERATOR) {//1/x若x为0则终止操作
if (operand == ) {
this.abortOperation();
return;
}
result = / operand;
}
this.ui.display.text = result + "";//显示结果
this.waitingForOperand = true;//处理完一个过程后将等待操作数设置为true
}
//+-操作符处理函数
Calculator.prototype.additiveOperatorClicked = function(op)
{
var operand = this.ui.display.text - ;//获取操作数
if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {//若有乘除操作符则先计算乘除
if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
this.abortOperation();
return;
}
this.ui.display.text = this.factorSoFar + "";
operand = this.factorSoFar;
this.factorSoFar = ;
this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
}
if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) {
if (!this.calculate(operand, this.pendingAdditiveOperator)) {
this.abortOperation();
return;
}
this.ui.display.text = this.sumSoFar + "";
} else {
this.sumSoFar = operand;
}
this.pendingAdditiveOperator = op;
this.waitingForOperand = true;
}
//乘除处理函数
Calculator.prototype.multiplicativeOperatorClicked = function(op)
{
var operand = this.ui.display.text - ;
if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {
if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
this.abortOperation();
return;
}
this.ui.display.text = this.factorSoFar + "";
} else {
this.factorSoFar = operand;
}
this.pendingMultiplicativeOperator = op;
this.waitingForOperand = true;
}
//等于处理函数
Calculator.prototype.equalClicked = function()
{
var operand = this.ui.display.text - ;
if (this.pendingMultiplicativeOperator != Calculator.NO_OPERATOR) {
if (!this.calculate(operand, this.pendingMultiplicativeOperator)) {
this.abortOperation();
return;
}
operand = this.factorSoFar;
this.factorSoFar = ;
this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
}
if (this.pendingAdditiveOperator != Calculator.NO_OPERATOR) {
if (!this.calculate(operand, this.pendingAdditiveOperator)) {
this.abortOperation();
return;
}
this.pendingAdditiveOperator = Calculator.NO_OPERATOR;
} else {
this.sumSoFar = operand;
}
this.ui.display.text = this.sumSoFar + "";
this.sumSoFar = ;
this.waitingForOperand = true;
}
Calculator.prototype.pointClicked = function()
{
if (this.waitingForOperand)
this.ui.display.text = "0";
if (this.ui.display.text.indexOf(".") == -)//text里不包含.时则添加.
this.ui.display.text += ".";
this.waitingForOperand = false;
}
//! [2]
//取负
Calculator.prototype.changeSignClicked = function()
{
var text = this.ui.display.text;
var value = text - ;
if (value > ) {
text = "-" + text;
} else if (value < ) {
text = text.slice();
}
this.ui.display.text = text;
}
//! [2]
Calculator.prototype.backspaceClicked = function()
{
if (this.waitingForOperand)
return;
var text = this.ui.display.text;
text = text.slice(, -);
if (text.length == ) {//获取的text为0时设置等待操作数为真
text = "0";
this.waitingForOperand = true;
}
this.ui.display.text = text;
}
//清除display数据
Calculator.prototype.clear = function()
{
if (this.waitingForOperand)
return;
this.ui.display.text = "0";
this.waitingForOperand = true;
}
//清空全部数据
Calculator.prototype.clearAll = function()
{
this.sumSoFar = ;
this.factorSoFar = ;
this.pendingAdditiveOperator = Calculator.NO_OPERATOR;
this.pendingMultiplicativeOperator = Calculator.NO_OPERATOR;
this.ui.display.text = "0";
this.waitingForOperand = true;
}
//清空存储的数据
Calculator.prototype.clearMemory = function()
{
this.sumInMemory = ;
}
//读取存储的数据并显示出来
Calculator.prototype.readMemory = function()
{
this.ui.display.text = this.sumInMemory + "";
this.waitingForOperand = true;
}
//设置存储数据并显示出来
Calculator.prototype.setMemory = function()
{
this.equalClicked();
this.sumInMemory = this.ui.display.text - ;
}
//添加到存储的数据中
Calculator.prototype.addToMemory = function()
{
this.equalClicked();
this.sumInMemory += this.ui.display.text - ;
}