#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <qmessagebox.h>
#include <QProgressDialog>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QProcess>
#include <qdebug.h>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowFlags(Qt::WindowMinimizeButtonHint|Qt::WindowCloseButtonHint);
this->setWindowTitle("CVC data translator");
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString str= QFileDialog::getExistingDirectory(this, "choose a dir","", QFileDialog::ShowDirsOnly);
this->ui->lineEdit->setText(str);
}
void MainWindow::on_pushButton_2_clicked()
{
QString str= QFileDialog::getExistingDirectory(this, "choose a dir","", QFileDialog::ShowDirsOnly);
this->ui->lineEdit_2->setText(str);
}
void MainWindow::on_pushButton_3_clicked()
{
QString srcpathname=this->ui->lineEdit->text();
QDir srcpath(srcpathname);
QMessageBox msgBox;
msgBox.setStandardButtons(QMessageBox::Ok);
msgBox.setDefaultButton(QMessageBox::Ok);
if(srcpath.exists()==false){
msgBox.setText("source dir is not exist ");
msgBox.exec();
return;
}
QDir destpath(this->ui->lineEdit_2->text());
if(destpath.exists()==false){
msgBox.setText("destination dir is not exist ");
msgBox.exec();
return;
}
QList<QString> alldirname;
findalldir(srcpathname,alldirname);
QList<QFileInfo> srcfileInfo,temp;
QList<QString> destfilelist;
QString destpathname = this->ui->lineEdit_2->text();
for(int dirnum=0;dirnum<alldirname.count();dirnum++){
if(destpathname.compare(alldirname.at(dirnum),Qt::CaseInsensitive)==0){
msgBox.setText("destination dir can not be set in source dir ");
msgBox.exec();
return;
}
QDir dir(alldirname.at(dirnum));
temp=dir.entryInfoList(QDir::Files);
srcfileInfo+=temp;
for(int m=0;m<temp.count();m++){
QString str=destpathname;
destfilelist.append(str.append(temp.at(m).filePath().mid(srcpathname.length())));
}
}
msgBox.setText("process finished ");
QProgressDialog *progressDlg=new QProgressDialog(this);
progressDlg->setModal(true);
progressDlg->setMinimumDuration(5);
progressDlg->setCancelButtonText("cancel");
int total=destfilelist.count();
progressDlg->setRange(0,total-1);
progressDlg->setValue(0);
// progressDlg->exec();
for(int n=0;n<total;n++){
progressDlg->setLabelText("source file:"+srcfileInfo.at(n).filePath());
progressDlg->setValue(n);
// qDebug()<<srcfileInfo.at(n).filePath();
QString str=srcfileInfo.at(n).fileName();
// qDebug()<<str;
if(str.endsWith(".mdb",Qt::CaseInsensitive)){
progressDlg->setWindowTitle("translation from mdb to txt... ");
dbTrans(srcfileInfo.at(n).filePath(),destfilelist.at(n));
}else{
if(str.endsWith(".flv",Qt::CaseInsensitive)){
progressDlg->setWindowTitle("translation from flv to mp4... ");
flvToMp4(srcfileInfo.at(n).filePath(),destfilelist.at(n));
}else{
progressDlg->setWindowTitle("copying... ");
copyfile(srcfileInfo.at(n).filePath(),destfilelist.at(n));
}
}
if(progressDlg->wasCanceled())
break;
}
progressDlg->close();
msgBox.exec();
}
void MainWindow::copyfile(QString srcPath,QString destPath)
{
QFile destfile(destPath);
if(destfile.exists()){
QString warntext="warning: there is a same filename in destination dir \n";
warntext.append(destPath);
QMessageBox::StandardButton rb = QMessageBox::warning(NULL, "DataTrans", warntext, QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
if(rb == QMessageBox::Yes){
destfile.remove();
destfile.close();
}
else return;
}
if(destfile.open(QIODevice::WriteOnly))
destfile.close();
else {
QDir tempdir;
QString strtemp=destPath;
int a=strtemp.lastIndexOf("/");
strtemp.resize(a);
tempdir.mkpath(strtemp);
destfile.close();
}
QFile srcfile(srcPath);
srcfile.open(QIODevice::ReadOnly);
destfile.open(QIODevice::WriteOnly);
char buffer[1024];
int n=srcfile.read(buffer,1024);
while(n>0){
destfile.write(buffer,n);
n=srcfile.read(buffer,1024);
}
srcfile.close();
destfile.close();
}
void MainWindow::findalldir(QString srcdir, QList<QString> & alldir)
{
QDir path(srcdir);
alldir.append(srcdir);
path.setFilter(QDir::AllDirs);
QFileInfoList list=path.entryInfoList();
for(int i=0;i<list.count();i++){
if(list.at(i).fileName()=="."||list.at(i).fileName()=="..")
continue;
findalldir(list.at(i).filePath(),alldir);
}
}
void MainWindow::dbTrans(QString srcPath,QString destPath)
{
int a=destPath.lastIndexOf("/");
QString destDir=destPath.left(a);
QDir tmp;
tmp.mkdir(destDir);
destDir+="/";
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
QString dsn = QString("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)}; FIL={MS Access};DBQ=%1;").arg(srcPath);
db.setDatabaseName(dsn);//设置连接字符串
db.setUserName("");//设置登陆数据库的用户名
if(srcPath.endsWith("/library.mdb"))
db.setPassword("");//设置密码
else db.setPassword("TMX");
db.open();
QStringList tables;
QString tabName,sqlString;
bool isVideo=false;
tables = db.tables(QSql::Tables);//获取表信息
for (int i = 0; i < tables.size(); ++i){
tabName = tables.at(i);//获取第i个表信息
isVideo=false;
if(tabName.compare("VideoElements",Qt::CaseInsensitive)==0)
isVideo=true;
sqlString = "select * from " + tabName;
if(tabName.compare("ModuleTable",Qt::CaseInsensitive)==0)
sqlString+=" order by SceneNumber asc";
QFile destFile(destDir+tabName+".txt");
destFile.open(QIODevice::WriteOnly);
QSqlQuery q(sqlString);
QSqlRecord rec = q.record();
int fieldCount = rec.count();
QString fieldName;
for(int j=0;j<fieldCount;j++){
fieldName = rec.fieldName(j);
if(j==fieldCount-1)fieldName+="\n";
else fieldName+="\t";
QByteArray ba = fieldName.toUtf8();//.toLatin1();
// char *tmp = ba.data();
destFile.write(ba);
}
while(q.next()){
for(int j=0;j<fieldCount;j++){
QString strTmp = q.value(j).toString();
if(j==2&&isVideo){
int k=strTmp.indexOf(".flv",0,Qt::CaseInsensitive);
if(k!=-1)
strTmp=strTmp.left(k)+".mp4";
}
if(j==fieldCount-1)strTmp+="\n";
else strTmp+="\t";
QByteArray ba = strTmp.toUtf8();//.toLatin1();
// char *data = a.data();
destFile.write(ba);
}
}
q.clear();
destFile.close();
if(destFile.fileName().endsWith("Quiz1Elements.txt")||destFile.fileName().endsWith("Quiz2Elements.txt")){
destFile.rename(destDir+tabName+".txt.bak");
destFile.open(QIODevice::ReadOnly);
QFile quizFile(destDir+tabName+".txt"
Qt应用程序连接access数据库
4星 · 超过85%的资源 需积分: 2 54 浏览量
2015-03-18
19:39:46
上传
评论 1
收藏 12KB ZIP 举报
sun_smile001
- 粉丝: 0
- 资源: 10
- 1
- 2
前往页