读取文件:
update 20140525:添加线程处理,在读取大文件时优化,防止app出现application假死状态。
bool SpreadSheet::readFile(const QString &filePath){ QFile file(filePath); if ( !file.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, tr("Spreadsheet"), tr("Cannot read file %1:\n%2.") .arg(file.fileName()) .arg(file.errorString())); return false; } QDataStream in(&file); in.setVersion(QDataStream::Qt_5_3); quint64 magic; in >> magic; if (SpreadSheet::MagicNumber != magic) { QMessageBox::warning(this, tr("Spreadsheet"), tr("The file is not a Spreadsheet file.")); return false; } clear(); quint32 row; quint32 column; QString str; QProgressDialog* process = progressDialog(this, tr("Load %1").arg(file.fileName()), SpreadSheet::mMaxRow); process->setModal(true); QApplication::setOverrideCursor(Qt::WaitCursor); while ( !in.atEnd()) { in >> row >> column >> str; setFormula(row, column, str); process->setValue(row); if ( process->wasCanceled()) { clear(); delete process; file.close(); } } QApplication::restoreOverrideCursor(); delete process; return true; }
写入文件:
update 20140525:添加线程处理,在写入大文件时优化,防止app出现application假死状态。
bool SpreadSheet::writeFile(const QString &filePath){ QFile file(filePath); if ( !file.open(QIODevice::WriteOnly)) { QMessageBox::warning(this, tr("Spreadsheet"), tr("Cannot write file %1:\n%2.") .arg(file.fileName()) .arg(file.errorString())); return false; } QDataStream out(&file); out.setVersion(QDataStream::Qt_5_3); out << (quint64) SpreadSheet::MagicNumber; QProgressDialog* progress = progressDialog(this, tr("Save %1").arg(file.fileName()), SpreadSheet::mMaxRow); progress->setModal(true); QApplication::setOverrideCursor(Qt::WaitCursor); QString str; for (int i(0); i != SpreadSheet::mMaxRow; ++i) { progress->setValue(i); qApp->processEvents(QEventLoop::ExcludeUserInputEvents); if ( progress->wasCanceled()) { file.remove(); delete progress; return false; } for (int j(0); j != SpreadSheet::mMaxColumn; ++j) { str = formula(i, j); if ( !str.isEmpty()) { out << (quint32)i << (quint32)j << str; } } } delete progress; QApplication::restoreOverrideCursor(); return true; }
使用到的函数:
QProgressDialog* SpreadSheet::progressDialog(QWidget* widget, const QString &str, const int range){ QProgressDialog* progressDialog(new QProgressDialog(widget)); progressDialog->setLabelText(str); progressDialog->setRange(0, range); return progressDialog; }