读取文件:
update 20140525:添加线程处理,在读取大文件时优化,防止app出现application假死状态。
1bool SpreadSheet::readFile(const QString &filePath){ 2 QFile file(filePath); 3 4 if ( !file.open(QIODevice::ReadOnly)) { 5 QMessageBox::warning(this, tr("Spreadsheet"), 6 tr("Cannot read file %1:\n%2.") 7 .arg(file.fileName()) 8 .arg(file.errorString())); 9 10 return false; 11 } 12 13 QDataStream in(&file); 14 in.setVersion(QDataStream::Qt_5_3); 15 16 quint64 magic; 17 in >> magic; 18 19 if (SpreadSheet::MagicNumber != magic) { 20 QMessageBox::warning(this, tr("Spreadsheet"), 21 tr("The file is not a Spreadsheet file.")); 22 23 return false; 24 } 25 26 clear(); 27 28 quint32 row; 29 quint32 column; 30 QString str; 31 32 QProgressDialog* process = 33 progressDialog(this, tr("Load %1").arg(file.fileName()), SpreadSheet::mMaxRow); 34 process->setModal(true); 35 36 QApplication::setOverrideCursor(Qt::WaitCursor); 37 38 while ( !in.atEnd()) { 39 in >> row >> column >> str; 40 setFormula(row, column, str); 41 42 process->setValue(row); 43 44 if ( process->wasCanceled()) { 45 clear(); 46 delete process; 47 file.close(); 48 } 49 } 50 51 QApplication::restoreOverrideCursor(); 52 delete process; 53 54 return true; 55}
写入文件:
update 20140525:添加线程处理,在写入大文件时优化,防止app出现application假死状态。
1bool SpreadSheet::writeFile(const QString &filePath){ 2 QFile file(filePath); 3 4 if ( !file.open(QIODevice::WriteOnly)) { 5 QMessageBox::warning(this, tr("Spreadsheet"), 6 tr("Cannot write file %1:\n%2.") 7 .arg(file.fileName()) 8 .arg(file.errorString())); 9 10 return false; 11 } 12 13 QDataStream out(&file); 14 out.setVersion(QDataStream::Qt_5_3); 15 16 out << (quint64) SpreadSheet::MagicNumber; 17 18 QProgressDialog* progress = 19 progressDialog(this, tr("Save %1").arg(file.fileName()), SpreadSheet::mMaxRow); 20 progress->setModal(true); 21 22 QApplication::setOverrideCursor(Qt::WaitCursor); 23 QString str; 24 25 for (int i(0); i != SpreadSheet::mMaxRow; ++i) { 26 progress->setValue(i); 27 qApp->processEvents(QEventLoop::ExcludeUserInputEvents); 28 29 if ( progress->wasCanceled()) { 30 file.remove(); 31 delete progress; 32 return false; 33 } 34 35 for (int j(0); j != SpreadSheet::mMaxColumn; ++j) { 36 str = formula(i, j); 37 38 if ( !str.isEmpty()) { 39 out << (quint32)i << (quint32)j << str; 40 } 41 } 42 } 43 44 delete progress; 45 QApplication::restoreOverrideCursor(); 46 47 return true; 48}
使用到的函数:
1QProgressDialog* SpreadSheet::progressDialog(QWidget* widget, 2 const QString &str, 3 const int range){ 4 QProgressDialog* progressDialog(new QProgressDialog(widget)); 5 progressDialog->setLabelText(str); 6 progressDialog->setRange(0, range); 7 8 return progressDialog; 9}