读取文件:
update 20140525:添加线程处理,在读取大文件时优化,防止 app 出现 application 假死状态。
cpp
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 假死状态。
cpp
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;
}
使用到的函数:
cpp
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;
}