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

📄 cell.cpp

📁 这个是qt3c++编程书(齐亮翻译),里面3,4章代码
💻 CPP
字号:
#include <qlineedit.h>#include <qregexp.h>#include "cell.h"Cell::Cell(QTable *table, const QString &formula)    : QTableItem(table, OnTyping){    setFormula(formula);}void Cell::setFormula(const QString &formula){    formulaStr = formula;    cacheIsDirty = true;}QString Cell::formula() const{    return formulaStr;}void Cell::setDirty(){    cacheIsDirty = true;}QString Cell::text() const{    if (value().isValid())        return value().toString();    else        return "####";}int Cell::alignment() const{    if (value().type() == QVariant::String)        return AlignLeft | AlignVCenter;    else        return AlignRight | AlignVCenter;}const QVariant Invalid;QVariant Cell::value() const{    if (cacheIsDirty) {        cacheIsDirty = false;        if (formulaStr.startsWith("'")) {            cachedValue = formulaStr.mid(1);        } else if (formulaStr.startsWith("=")) {            cachedValue = Invalid;            QString expr = formulaStr.mid(1);            expr.replace(" ", "");            int pos = 0;            cachedValue = evalExpression(expr, pos);            if (pos < (int)expr.length())                cachedValue = Invalid;        } else {            bool ok;            double d = formulaStr.toDouble(&ok);            if (ok)                cachedValue = d;            else                cachedValue = formulaStr;        }    }    return cachedValue;}QVariant Cell::evalExpression(const QString &str, int &pos) const{    QVariant result = evalTerm(str, pos);    while (pos < (int)str.length()) {        QChar op = str[pos];        if (op != '+' && op != '-')            return result;        ++pos;        QVariant term = evalTerm(str, pos);        if (result.type() == QVariant::Double                && term.type() == QVariant::Double) {            if (op == '+')                result = result.toDouble() + term.toDouble();            else                result = result.toDouble() - term.toDouble();        } else {            result = Invalid;        }    }    return result;}QVariant Cell::evalTerm(const QString &str, int &pos) const{    QVariant result = evalFactor(str, pos);    while (pos < (int)str.length()) {        QChar op = str[pos];        if (op != '*' && op != '/')            return result;        ++pos;        QVariant factor = evalFactor(str, pos);        if (result.type() == QVariant::Double                && factor.type() == QVariant::Double) {            if (op == '*') {                result = result.toDouble() * factor.toDouble();            } else {                if (factor.toDouble() == 0.0)                    result = Invalid;                else                    result = result.toDouble() / factor.toDouble();            }        } else {            result = Invalid;        }    }    return result;}QVariant Cell::evalFactor(const QString &str, int &pos) const{    QVariant result;    bool negative = false;    if (str[pos] == '-') {        negative = true;        ++pos;    }    if (str[pos] == '(') {        ++pos;        result = evalExpression(str, pos);        if (str[pos] != ')')            result = Invalid;        ++pos;    } else {        QRegExp regExp("[A-Za-z][1-9][0-9]{0,2}");        QString token;        while (str[pos].isLetterOrNumber() || str[pos] == '.') {            token += str[pos];            ++pos;        }        if (regExp.exactMatch(token)) {            int col = token[0].upper().unicode() - 'A';            int row = token.mid(1).toInt() - 1;            Cell *c = (Cell *)table()->item(row, col);            if (c)                result = c->value();            else                result = 0.0;        } else {            bool ok;            result = token.toDouble(&ok);            if (!ok)                result = Invalid;        }    }    if (negative) {        if (result.type() == QVariant::Double)            result = -result.toDouble();        else            result = Invalid;    }    return result;}

⌨️ 快捷键说明

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