下载地址:
https://download.csdn.net/download/cqltbe131421/11029050
#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QTextStream>
#include <QTextCodec>
#include <QDebug>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
setWindowTitle(tr("文件格式转换"));
init_codec_list();
}
Widget::~Widget()
{
delete ui;
}
void Widget::on_select_files_btn_clicked()
{
QStringList files = QFileDialog::getOpenFileNames(
this,
tr("选择文件"),
".",
"CPP Files (*.h *.cpp ) | Text Files (*.txt) | All Files (*.*)");
if(files.isEmpty())
{
return;
}
fill_items(files);
ui->file_list->resizeColumnsToContents();
}
void Widget::on_convert_btn_clicked()
{
int src_mib = ui->src_code_combox->itemData(ui->src_code_combox->currentIndex()).toInt();
QTextCodec *src_codec = QTextCodec::codecForMib(src_mib);
int dest_mib = ui->dest_code_combox->itemData(ui->dest_code_combox->currentIndex()).toInt();
QTextCodec *dest_codec = QTextCodec::codecForMib(dest_mib);
for(int idx=0; idx<all_files.size(); ++idx)
{
QString file_name = all_files[idx];
QFile in_file(file_name);
if(!in_file.exists())
{
fill_result(idx, false);
continue;
}
QFile out_file("tmp");
QFileInfo file_info(file_name);
if (!in_file.open(QIODevice::ReadOnly | QIODevice::Text) || !out_file.open(QIODevice::WriteOnly | QIODevice::Text))
{
fill_result(idx, false);
continue;
}
//文件转码
QByteArray encoded_data = in_file.readAll();
QTextStream in(&encoded_data);
in.setAutoDetectUnicode(false);
in.setCodec(src_codec);
QString decoded_str = in.readAll();
QTextStream out(&out_file);
out.setCodec(dest_codec);
out << decoded_str;
fill_result(idx, true);
// fill_row_count(idx, row_count);
//备份文件
if(ui->back_src_ckb->isChecked())
{
QString back_file = QString("%1_bak").arg(file_info.fileName());
in_file.copy(back_file);
}
in_file.close();
in_file.remove();
out_file.close();
out_file.rename(file_name);
}
}
void Widget::init_codec_list()
{
QMap<QString, QTextCodec *> codecMap;
QRegExp iso8859RegExp("ISO[- ]8859-([0-9]+).*");
foreach (int mib, QTextCodec::availableMibs()) {
QTextCodec *codec = QTextCodec::codecForMib(mib);
QString sortKey = codec->name().toUpper();
int rank;
if (sortKey.startsWith("UTF-8")) {
rank = 1;
} else if (sortKey.startsWith("UTF-16")) {
rank = 2;
} else if (iso8859RegExp.exactMatch(sortKey)) {
if (iso8859RegExp.cap(1).size() == 1)
rank = 3;
else
rank = 4;
} else {
rank = 5;
}
sortKey.prepend(QChar('0' + rank));
codecMap.insert(sortKey, codec);
}
QList<QTextCodec *> codec_list = codecMap.values();
ui->src_code_combox->clear();
ui->dest_code_combox->clear();
foreach (QTextCodec* codec, codec_list) {
ui->src_code_combox->addItem(codec->name(), codec->mibEnum());
ui->dest_code_combox->addItem(codec->name(), codec->mibEnum());
}
}
void Widget::fill_items(QStringList files)
{
int row_idx = ui->file_list->rowCount();
foreach(QString file_name, files)
{
if(all_files.contains(file_name))
{
continue;
}
ui->file_list->insertRow(row_idx);
QTableWidgetItem *newItem = new QTableWidgetItem(file_name);
ui->file_list->setItem(row_idx, 0, newItem);
all_files.append(file_name);
}
}
void Widget::fill_result(int row_idx, bool result)
{
QString result_str = result?QString("%1").arg("Y"):QString("%1").arg("N");
QTableWidgetItem *result_item = new QTableWidgetItem(result_str);
ui->file_list->setItem(row_idx, 1, result_item);
}
void Widget::fill_row_count(int row_idx, int row_count)
{
QTableWidgetItem *row_count_item = new QTableWidgetItem(QString("%1").arg(row_count));
ui->file_list->setItem(row_idx, 2, row_count_item);
}
void Widget::on_file_list_itemSelectionChanged()
{
qDebug()<<"on_file_list_itemSelectionChanged";
QList<QTableWidgetItem *> items = ui->file_list->selectedItems();
ui->del_btn->setEnabled(!items.isEmpty());
}
void Widget::on_del_btn_clicked()
{
QList<int> del_rows;
QList<QTableWidgetItem *> items = ui->file_list->selectedItems();
foreach(QTableWidgetItem* cur_item, items)
{
int row_idx = cur_item->row();
if(del_rows.contains(row_idx))
{
continue;
}
del_rows.append(row_idx);
}
//删除选中项
foreach(int row_idx, del_rows)
{
QTableWidgetItem* file_name_item = ui->file_list->item(row_idx, 0);
QString file_name = file_name_item->text();
ui->file_list->removeRow(row_idx);
all_files.removeOne(file_name);
}
}