dictloader.cpp
来自「Qt开发的GRE背单词软件」· C++ 代码 · 共 165 行
CPP
165 行
#include <QtSql/QSqlQuery>
#include <QMessageBox>
#include <QProgressDialog>
#include <QApplication>
#include "DictLoader.h"
DictLoader::DictLoader(const QString& file, const QString& dict, QObject *parent)
: QObject(parent), fileName(file), dictName(dict) {}
bool DictLoader::createDictTable(const QString& dict)
{
QSqlQuery query;
return query.exec(tr("CREATE TABLE %1 (编号 int primary key, \
单词 varchar, \
解释 varchar, \
得分 int, \
音标 varchar, \
备注 varchar, \
排序 int)").arg(dict));
}
void DictLoader::delDict(const QString& dict)
{
QSqlQuery query;
query.exec(tr("DROP TABLE %1").arg(dict));
query.exec(tr("DELETE FROM Library WHERE dict = \"%1\"").arg(dict));
query.exec(tr("DELETE FROM History WHERE dict = \"%1\"").arg(dict));
}
void DictLoader::addDictToLibrary(const QString& dict)
{
QSqlQuery query;
query.exec(tr("INSERT INTO Library VALUES(\'%1\')").arg(dict));
}
void DictLoader::load()
{
if(!createDictTable(dictName))
{
QMessageBox::critical(0, tr("错误"), tr("无法创建词典"));
return;
}
if(doLoad())
addDictToLibrary(dictName);
else
delDict(dictName);
}
int DictLoader::check()
{
file.setFileName(fileName);
if(!file.open(QFile::ReadOnly))
{
QMessageBox::critical(0, tr("错误"), tr("打开文件错误"));
return -1;
}
currentRow = 0;
int wordCount = 0;
is.setDevice(&file); // beginning
QString line;
do {
line = getLine();
} while(isBeginLine(line));
while(!is.atEnd())
{
if(!isEnglishLine(line)) // english
{
showError();
return -1;
}
if(getLine().isEmpty()) // chinese
{
showError();
return -1;
}
do
{
line = getLine();
} while (!line.isEmpty());
while(!is.atEnd() && line.isEmpty()) // empty
line = getLine();
wordCount ++;
}
return wordCount;
}
bool DictLoader::doLoad()
{
int wordCount = check();
if(wordCount == -1)
return false;
is.seek(0);
QString line;
do {
line = getLine();
} while(isBeginLine(line));
id = 0;
QProgressDialog progress(tr("一共%1个单词,正在导入...").arg(wordCount),
0, 0, wordCount);
progress.setWindowTitle(tr("词典导入中"));
progress.setWindowModality(Qt::WindowModal);
QSqlDatabase::database().transaction();
QString english, chinese;
while(!is.atEnd())
{
english = line;
chinese = getLine();
line = getLine();
while (!line.isEmpty())
{
chinese += line;
line = getLine();
}
addRecord(english, chinese);
progress.setValue(id);
qApp->processEvents();
while(!is.atEnd() && line.isEmpty())
line = getLine();
}
QSqlDatabase::database().commit();
return true;
}
void DictLoader::showError() {
QMessageBox::critical(0, tr("文件格式有误"), tr("请检查第%1行").arg(currentRow));
}
bool DictLoader::isEnglishLine(const QString& line)
{
return ( line.contains("[") && line.contains("]")) ||
(!line.contains("[") && !line.contains("]"));
}
QString DictLoader::getLine()
{
currentRow ++;
return is.readLine();
}
bool DictLoader::isBeginLine(const QString& line) {
return !line.contains("[") && !line.contains("]"); // no []
}
void DictLoader::addRecord(const QString& englishLine, const QString& chinese)
{
QString english = englishLine.section(' ', 0, 0);
QString phonetic = englishLine.section(' ', 1, -1, QString::SectionSkipEmpty);
QSqlQuery query;
query.exec(tr("INSERT INTO %1 VALUES (\"%2\", \"%3\", \"%4\", 0, \"%5\", \"\", 0)")
.arg(dictName).arg(++id).arg(english).arg(chinese).arg(phonetic));
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?