读取文件:
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;
- }