⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 phone.cpp

📁 嵌入式Qt下的一个计算器源码
💻 CPP
字号:
/******************************************************************************** Copyright (C) 2000-2006 TROLLTECH ASA. All rights reserved.**** This file is part of the Phone Edition of the Qtopia Toolkit.**** Licensees holding a valid license agreement from Trolltech or any of its** authorized distributors may use this file in accordance with** the License Agreement provided with the Licensed Software.**** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for**   information about Trolltech's Commercial License Agreements.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.********** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "../engine.h"#include "../phoneinstruction.h"#include "phone.h"#include <qtopia/qsoftmenubar.h>#include <qtopia/qtopiaapplication.h>#include <QSignalMapper>#include <QShortcut>#include <QKeyEvent>#include <QDebug>static const int KEY_HOLD_TIME = 300;FormPhone::FormPhone(QWidget *parent)    : CalcUserInterface(parent){    lastInstruction = 0;    displayedState = drNone;    connect(systemEngine,SIGNAL(dualResetStateChanged(ResetState)),        this,SLOT(changeResetButtonText(ResetState)));    lockEvaluation = firstNumber = true;    backpressed = false;    setFocusPolicy(Qt::TabFocus);#if defined(QTOPIA_PHONE)    QtopiaApplication::setInputMethodHint( this, QtopiaApplication::Number );    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);    QSoftMenuBar::setLabel(this, Qt::Key_Back, QSoftMenuBar::BackSpace);#endif    // DPad shortcuts    QVector<int> keyIdents(13);    keyIdents.append(Qt::Key_Up);    keyIdents.append(Qt::Key_Plus);    keyIdents.append(Qt::Key_Down);    keyIdents.append(Qt::Key_Minus);    keyIdents.append(Qt::Key_Right);    keyIdents.append(Qt::Key_Left);    keyIdents.append(Qt::Key_Slash);    keyIdents.append(Qt::Key_Select);    keyIdents.append(Qt::Key_NumberSign);    keyIdents.append(Qt::Key_Asterisk);    keyIdents.append(Qt::Key_Enter);    keyIdents.append(Qt::Key_Return);    keyIdents.append(Qt::Key_Equal);        signalMapper = new QSignalMapper(this);    QShortcut * shortcut = 0;    foreach (int ident, keyIdents) {        shortcut = new QShortcut(QKeySequence(ident), this);        connect(shortcut, SIGNAL(activated()), signalMapper, SLOT(map()));        signalMapper->setMapping(shortcut, ident);    }    connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(shortcutClicked(int)));    Instruction *da = new iPhoneDoubleFactory();    systemEngine->registerInstruction(da);    da = new iEvaluateLine();    systemEngine->registerInstruction(da);    da = new iPhoneDoubleCopy();    systemEngine->registerInstruction(da);    da = new iPhoneAddDoubleDouble();    systemEngine->registerInstruction(da);    da = new iPhoneMultiplyDoubleDouble();    systemEngine->registerInstruction(da);    da = new iPhoneSubtractDoubleDouble();    systemEngine->registerInstruction(da);    da = new iPhoneDivideDoubleDouble();    systemEngine->registerInstruction(da);    }void FormPhone::shortcutClicked(int keyIdent) {    switch(keyIdent) {        case Qt::Key_Up :        case Qt::Key_Plus:            plus();            break;        case Qt::Key_Down:        case Qt::Key_Minus:            minus();            break;        case Qt::Key_Right:            times();             break;        case Qt::Key_Left:        case Qt::Key_Slash:            div();             break;        case Qt::Key_Select:        case Qt::Key_Enter:        case Qt::Key_Return:        case Qt::Key_Equal:            eval(); break;        case Qt::Key_NumberSign:            nextInstruction(); break;        case Qt::Key_Asterisk:            dec();            break;    }}void FormPhone::showEvent ( QShowEvent *e ) {    systemEngine->setAccType("Double"); // No tr        QWidget::showEvent(e);}void FormPhone::plus(){    systemEngine->pushInstruction("Add");    lastInstruction=1;    firstNumber = false;#if defined(QTOPIA_PHONE)    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);#endif    lockEvaluation = true;}void FormPhone::minus(){    systemEngine->pushInstruction("Subtract");    lastInstruction=2;    firstNumber = false;#if defined(QTOPIA_PHONE)    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);#endif    lockEvaluation = true;}void FormPhone::times(){    systemEngine->pushInstruction("Multiply");    lastInstruction=3;    firstNumber = false;#if defined(QTOPIA_PHONE)    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);#endif    lockEvaluation = true;}void FormPhone::div(){    systemEngine->pushInstruction("Divide");    lastInstruction=0;    firstNumber = false;#if defined(QTOPIA_PHONE)    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);#endif    lockEvaluation = true;}void FormPhone::eval(){    if (#if defined(QTOPIA_PHONE)             !lockEvaluation#else	    true#endif    ) {        systemEngine->evaluate();        firstNumber = true;#if defined(QTOPIA_PHONE)	QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);#endif        lockEvaluation = true;    }}void FormPhone::dec() {    systemEngine->push('.');}void FormPhone::nextInstruction(){    switch (lastInstruction){        case 0:            plus();            break;        case 1:            minus();            break;        case 2:            times();            break;        case 3:            div();            break;    }}void FormPhone::changeResetButtonText ( ResetState drs ) {    displayedState = drs;    if (drs == drNone || drs == drHard) {        firstNumber = true;#if defined(QTOPIA_PHONE)         QSoftMenuBar::setLabel(this, Qt::Key_Back, QSoftMenuBar::Back);#endif    } else {#if defined(QTOPIA_PHONE)	QSoftMenuBar::setLabel(this, Qt::Key_Back, QSoftMenuBar::BackSpace);#endif    }}void FormPhone::keyReleaseEvent(QKeyEvent *e){    if ((e->key() == Qt::Key_Back || e->key() == Qt::Key_Delete || e->key() == Qt::Key_Backspace )             && !e->isAutoRepeat()             && backpressed) {	backpressed = false;	if ( tid_hold ) {            killTimer(tid_hold);            tid_hold = 0;            systemEngine->delChar();#if defined(QTOPIA_PHONE)            int numDataOps = systemEngine->numOps();            if ((numDataOps % 2 == 1)) {                QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);                lockEvaluation = true;                if (numDataOps == 1)                    firstNumber = true;            } else {                QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::Ok);                lockEvaluation = false;            }#endif         } else {            if (e->key() == Qt::Key_Back)	    close();	}    }#if defined(QTOPIA_PHONE)    switch (e->key())    {        case Qt::Key_0:        case Qt::Key_1:        case Qt::Key_2:        case Qt::Key_3:        case Qt::Key_4:        case Qt::Key_5:        case Qt::Key_6:        case Qt::Key_7:        case Qt::Key_8:        case Qt::Key_9:        case Qt::Key_Asterisk:            if (systemEngine->numOps()%2 == 0)                firstNumber = false;            if (!firstNumber) {                QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::Ok);                lockEvaluation = false;            }    }#endif    e->accept();}void FormPhone::keyPressEvent(QKeyEvent *e) {    if (e->key() != Qt::Key_NumberSign){        lastInstruction = 0;    }    switch(e->key()) {        case Qt::Key_0:        case Qt::Key_1:        case Qt::Key_2:        case Qt::Key_3:        case Qt::Key_4:        case Qt::Key_5:        case Qt::Key_6:        case Qt::Key_7:        case Qt::Key_8:        case Qt::Key_9:            {                QChar qc = e->text().at(0);	        if ( qc.isPrint() && !qc.isSpace() ) 		    systemEngine->push(qc.toLatin1());            }            break;        case Qt::Key_Back:        case Qt::Key_No:        case Qt::Key_Delete:        case Qt::Key_Backspace:            if ( displayedState == drNone || displayedState == drHard ) {                if ( systemEngine->error() )                    clearAll();                else                    if (e->key() == Qt::Key_Back || e->key() == Qt::Key_No)                        close();            } else if (!e->isAutoRepeat()){                tid_hold = startTimer(KEY_HOLD_TIME);                backpressed = true;            }            break;        default:            e->ignore();            //qDebug() << "Key not handled: " << e->key();            break;                }}void FormPhone::clearAll(){    if (displayedState == drSoft) {	systemEngine->softReset();	systemEngine->hardReset();    }    else	systemEngine->hardReset();#ifdef QTOPIA_PHONE    if( !Qtopia::mousePreferred() )	setEditFocus(true);#endif#if defined(QTOPIA_PHONE)    QSoftMenuBar::setLabel(this, Qt::Key_Select, QSoftMenuBar::NoLabel);    lockEvaluation = true;#endif}void FormPhone::timerEvent(QTimerEvent *e){#ifdef QTOPIA_PHONE   if (e->timerId() == tid_hold) {        QSoftMenuBar::setLabel(this, Qt::Key_Back, QSoftMenuBar::Back);        killTimer(tid_hold);        tid_hold = 0;   }#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -