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

📄 pumpspreadsheet.cpp

📁 QT4 gui programming的随书光盘
💻 CPP
字号:
#include <QtGui>#include <QtXml>#include "pumpspreadsheet.h"PumpSpreadsheet::PumpSpreadsheet(QWidget *parent)    : QTableWidget(parent){    clearData();}void PumpSpreadsheet::clearData(){    setRowCount(0);    setColumnCount(0);    setColumnCount(ColumnCount);    setHorizontalHeaderItem(Date, new QTableWidgetItem(tr("Date")));    setHorizontalHeaderItem(Time, new QTableWidgetItem(tr("Time")));    setHorizontalHeaderItem(Pump, new QTableWidgetItem(tr("Pump")));    setHorizontalHeaderItem(Company,                            new QTableWidgetItem(tr("Company")));    setHorizontalHeaderItem(User, new QTableWidgetItem(tr("User")));    setHorizontalHeaderItem(Quantity,                            new QTableWidgetItem(tr("Quantity")));    setHorizontalHeaderItem(Status, new QTableWidgetItem(tr("Status")));}bool PumpSpreadsheet::addData(const QString &fileName,                              FileFormat format){    if (format == Pump2000) {        return addDataInPump2000Format(fileName);    } else {        return addDataInGasPumpXmlFormat(fileName);    }}bool PumpSpreadsheet::saveData(const QString &fileName,                               FileFormat format){    if (format == Pump2000) {        return saveDataInPump2000Format(fileName);    } else {        return saveDataInGasPumpXmlFormat(fileName);    }}void PumpSpreadsheet::sortByColumn(Column column, Qt::SortOrder order){    sortItems(column, order);}void PumpSpreadsheet::applyFilter(const PumpFilter &filter){    int row = 0;    while (row < rowCount()) {        if (matches(row, filter)) {            ++row;        } else {            removeRow(row);        }    }}void PumpSpreadsheet::convertUnits(double factor){    for (int row = 0; row < rowCount(); ++row) {        double newQuantity = factor * text(row, Quantity).toDouble();        setText(row, Quantity, QString::number(newQuantity));    }}void PumpSpreadsheet::computeTotals(Column column){    sortByColumn(column);    int row = 0;    while (row < rowCount()) {        if (row > 0 && text(row - 1, column) == text(row, column)) {            double newQuantity = text(row - 1, Quantity).toDouble()                                 + text(row, Quantity).toDouble();            setText(row - 1, Quantity, QString::number(newQuantity));            removeRow(row);        } else {            for (int c = 0; c < ColumnCount; ++c) {                if (c != column && c != Quantity)                    setText(row, c, "*");            }            ++row;        }    }}void PumpSpreadsheet::setText(int row, int column, const QString &text){    QTableWidgetItem *item = this->item(row, column);    if (item)        item->setText(text);}QString PumpSpreadsheet::text(int row, int column) const{    QTableWidgetItem *item = this->item(row, column);    if (item) {        return item->text();    } else {        return "";    }}void PumpSpreadsheet::showWarning(const QString &message){    if (isVisible())        QMessageBox::warning(this, tr("Gas Pump"), message);}bool PumpSpreadsheet::addDataInPump2000Format(const QString &fileName){    QFile file(fileName);    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {        showWarning(tr("Cannot read file %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    QTextStream in(&file);    while (!in.atEnd()) {        QString line = in.readLine().simplified();        QStringList fields = line.split(' ');        if (fields.count() == 7)            addItem(fields);    }    file.close();    if (file.error() != QFile::NoError) {        showWarning(tr("Error when reading from %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    return true;}bool PumpSpreadsheet::addDataInGasPumpXmlFormat(const QString &fileName){    QFile file(fileName);    if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {        showWarning(tr("Cannot read file %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    QXmlStreamReader reader(&file);    reader.readNext();    while (!reader.atEnd()) {        if (reader.isStartElement()) {            if (reader.name() == "gpx") {                readGpxElement(reader);            } else {                reader.raiseError(tr("Not a Gas Pump XML file"));            }        } else {            reader.readNext();        }    }    file.close();    if (file.error() != QFile::NoError) {        showWarning(tr("Error when writing to %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    return true;}void PumpSpreadsheet::readGpxElement(QXmlStreamReader &reader){    reader.readNext();    while (!reader.atEnd()) {        if (reader.isEndElement()) {            reader.readNext();            break;        }        if (reader.isStartElement()) {            if (reader.name() == "transaction") {                readTransactionElement(reader);            } else {                reader.raiseError(tr("Unknown element %1")                                  .arg(reader.name().toString()));            }        } else {            reader.readNext();        }    }}bool PumpSpreadsheet::saveDataInPump2000Format(const QString &fileName){    QFile file(fileName);    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {        showWarning(tr("Cannot write file %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    QTextStream out(&file);    for (int row = 0; row < rowCount(); ++row) {        for (int column = 0; column < ColumnCount; ++column) {            out << text(row, column);            if (column < ColumnCount - 1) {                out << "\t";            } else {                out << endl;            }        }    }    file.close();    if (file.error() != QFile::NoError) {        showWarning(tr("Error when writing to %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    return true;}void PumpSpreadsheet::readTransactionElement(QXmlStreamReader &reader){    QMap<QString, QString> map;    reader.readNext();    while (!reader.atEnd()) {        if (reader.isEndElement()) {            reader.readNext();            break;        }        if (reader.isStartElement()) {            QString key = reader.name().toString();            map.insert(key, reader.readElementText());        }        reader.readNext();    }    QStringList fields;    fields << map.value("date") << map.value("time")           << map.value("pump") << map.value("company")           << map.value("user") << map.value("quantity")           << map.value("status");    addItem(fields);}bool PumpSpreadsheet::saveDataInGasPumpXmlFormat(        const QString &fileName){    QFile file(fileName);    if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {        showWarning(tr("Cannot write file %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    QXmlStreamWriter writer(&file);    writer.setAutoFormatting(true);    writer.writeStartDocument();    writer.writeStartElement("gpx");    for (int row = 0; row < rowCount(); ++row) {        writer.writeStartElement("transaction");        writer.writeTextElement("date", text(row, Date));        writer.writeTextElement("time", text(row, Time));        writer.writeTextElement("pump", text(row, Pump));        writer.writeTextElement("company", text(row, Company));        writer.writeTextElement("user", text(row, User));        writer.writeTextElement("quantity", text(row, Quantity));        writer.writeTextElement("status", text(row, Status));        writer.writeEndElement();    }    writer.writeEndElement();    writer.writeEndDocument();    file.close();    if (file.error() != QFile::NoError) {        showWarning(tr("Error when writing to %1:\n%2.")                    .arg(file.fileName())                    .arg(file.errorString()));        return false;    }    return true;}void PumpSpreadsheet::addItem(const QStringList &fields){    int row = rowCount();    setRowCount(row + 1);    QTableWidgetItem *dateItem = new QTableWidgetItem;    dateItem->setData(Qt::DisplayRole,                      QDate::fromString(fields[0], Qt::ISODate));    setItem(row, Date, dateItem);    QTableWidgetItem *timeItem = new QTableWidgetItem;    timeItem->setData(Qt::DisplayRole,                      QTime::fromString(fields[1], Qt::ISODate));    setItem(row, Time, timeItem);    QTableWidgetItem *pumpItem = new QTableWidgetItem(fields[2]);    pumpItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);    setItem(row, Pump, pumpItem);    QTableWidgetItem *companyItem = new QTableWidgetItem(fields[3]);    companyItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);    setItem(row, Company, companyItem);    QTableWidgetItem *userItem = new QTableWidgetItem(fields[4]);    userItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);    setItem(row, User, userItem);    QTableWidgetItem *quantityItem = new QTableWidgetItem;    quantityItem->setData(Qt::DisplayRole, fields[5].toDouble());    quantityItem->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);    setItem(row, Quantity, quantityItem);    QTableWidgetItem *statusItem = new QTableWidgetItem(fields[6]);    setItem(row, Status, statusItem);}bool PumpSpreadsheet::matches(int row, const PumpFilter &filter) const{    QDate date = item(row, Date)->data(Qt::DisplayRole).toDate();    QTime time = item(row, Time)->data(Qt::DisplayRole).toTime();    QString pump = text(row, Pump);    QString company = text(row, Company);    QString user = text(row, User);    double quantity = text(row, Quantity).toDouble();    QString status = text(row, Status);    return (date >= filter.fromDate && date <= filter.toDate)           && (time >= filter.fromTime && time <= filter.toTime)           && (filter.pump.isEmpty() || pump == filter.pump)           && (filter.company.isEmpty() || company == filter.company)           && (filter.user.isEmpty() || user == filter.user)           && (quantity >= filter.fromQuantity               && quantity <= filter.toQuantity)           && (filter.status.isEmpty() || status == filter.status);}PumpFilter::PumpFilter(){    fromDate.setDate(1900, 1, 1);    toDate.setDate(7999, 12, 31);    fromTime.setHMS(0, 0, 0);    toTime.setHMS(23, 59, 59);    fromQuantity = 0.0;    toQuantity = 1000000000.0;}

⌨️ 快捷键说明

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