195 lines
5.3 KiB
C++
195 lines
5.3 KiB
C++
#include "mainwindow.h"
|
|
#include "ui_mainwindow.h"
|
|
#include <QFile>
|
|
#include <QTextStream>
|
|
#include <QTableWidget>
|
|
#include <QFileDialog>
|
|
#include <QProgressDialog>
|
|
#include <QMessageBox>
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
: QMainWindow(parent)
|
|
, ui(new Ui::MainWindow)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
setAcceptDrops(true); // 允许窗口接受拖放事件
|
|
|
|
connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::onOpenButtonClicked);
|
|
connect(ui->actionSave, &QAction::triggered, this, &MainWindow::onSaveButtonClicked);
|
|
|
|
QIcon openIcon = QApplication::style()->standardIcon(QStyle::SP_DialogOpenButton);
|
|
QIcon saveIcon = QApplication::style()->standardIcon(QStyle::SP_DialogSaveButton);
|
|
|
|
ui->actionOpen->setIcon(openIcon);
|
|
ui->actionSave->setIcon(saveIcon);
|
|
|
|
ui->actionOpen->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_N));
|
|
ui->actionSave->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));
|
|
}
|
|
|
|
MainWindow::~MainWindow()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void MainWindow::loadTextFile(const QString& fileName)
|
|
{
|
|
QFile file(fileName);
|
|
|
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
|
{
|
|
// 文件打开失败,处理错误
|
|
return;
|
|
}
|
|
|
|
QTextStream in(&file);
|
|
|
|
// 获取文件大小并预分配内存
|
|
qint64 fileSize = file.size();
|
|
QString textData;
|
|
textData.reserve(fileSize);
|
|
|
|
int tableRow = 0;
|
|
int tableCol = 0;
|
|
while (!in.atEnd())
|
|
{
|
|
QString line = in.readLine();
|
|
textData += line + "\n"; // 保存所有文本数据
|
|
tableRow++;
|
|
|
|
if (tableRow == 2)
|
|
{
|
|
tableCol = line.split("\t").count(); // 获取第二行的列数
|
|
}
|
|
}
|
|
|
|
file.close();
|
|
|
|
progressDialog = new QProgressDialog("Loading...", "Cancel", 0, 0, this);
|
|
progressDialog->setWindowModality(Qt::WindowModal);
|
|
progressDialog->setAutoClose(false);
|
|
progressDialog->setAutoReset(false);
|
|
progressDialog->setRange(0, tableRow);
|
|
progressDialog->setValue(0);
|
|
progressDialog->show();
|
|
|
|
// 将数据显示在表格中
|
|
QTableWidget* tableWidget = ui->tableWidget;
|
|
|
|
// 设置表格的行数和列数
|
|
tableWidget->setRowCount(tableRow);
|
|
tableWidget->setColumnCount(tableCol);
|
|
|
|
tableWidget->blockSignals(true); // 阻止信号发射
|
|
|
|
QStringList rows = textData.split("\n");
|
|
for (int i = 0; i < tableRow; ++i)
|
|
{
|
|
QStringList row = rows.at(i).split("\t");
|
|
|
|
if (i == 1)
|
|
{
|
|
// 获取第二行的列名-设置表格的列标题
|
|
tableWidget->setHorizontalHeaderLabels(row);
|
|
}
|
|
|
|
for (int j = 0; j < tableCol; ++j)
|
|
{
|
|
QTableWidgetItem* item = new QTableWidgetItem(row.at(j));
|
|
tableWidget->setItem(i, j, item);
|
|
}
|
|
progressDialog->setValue(i);
|
|
QApplication::processEvents(); // 处理界面事件,使进度条能够更新
|
|
if (progressDialog->wasCanceled())
|
|
{
|
|
tableWidget->clear();
|
|
break;
|
|
}
|
|
}
|
|
progressDialog->setValue(tableRow);
|
|
progressDialog->hide();
|
|
tableWidget->blockSignals(false); // 恢复信号发射
|
|
}
|
|
|
|
void MainWindow::onOpenButtonClicked()
|
|
{
|
|
QString fileName = QFileDialog::getOpenFileName(this, "Open Text File", "", "Text Files (*.txt)");
|
|
if (!fileName.isEmpty())
|
|
{
|
|
loadTextFile(fileName);
|
|
}
|
|
}
|
|
|
|
void MainWindow::onSaveButtonClicked()
|
|
{
|
|
QString fileName = QFileDialog::getSaveFileName(this, "Save Text File", "", "Text Files (*.txt)");
|
|
if (!fileName.isEmpty())
|
|
{
|
|
QFile file(fileName);
|
|
if (file.open(QIODevice::WriteOnly))
|
|
{
|
|
// 写入UTF-16带有BOM的标记
|
|
QByteArray bom;
|
|
bom.append((char)0xFF);
|
|
bom.append((char)0xFE);
|
|
file.write(bom);
|
|
|
|
QTextStream out(&file);
|
|
out.setCodec("UTF-16LE");//Qt6 use: out.setEncoding(QStringConverter::Utf16LE);
|
|
|
|
QTableWidget* tableWidget = ui->tableWidget;
|
|
int rowCount = tableWidget->rowCount();
|
|
int columnCount = tableWidget->columnCount();
|
|
|
|
for (int i = 0; i < rowCount; ++i)
|
|
{
|
|
for (int j = 0; j < columnCount; ++j)
|
|
{
|
|
QTableWidgetItem* item = tableWidget->item(i, j);
|
|
if (item != nullptr)
|
|
{
|
|
QString text = item->text();
|
|
out << text;
|
|
}
|
|
|
|
if (j != columnCount - 1)
|
|
{
|
|
out << "\t"; // 制表符分隔
|
|
}
|
|
}
|
|
|
|
out << "\r\n"; // 换行,注意使用\r\n表示换行符
|
|
}
|
|
|
|
file.close();
|
|
QMessageBox::information(this, "保存完成", "文件已成功保存。");
|
|
}
|
|
}
|
|
}
|
|
|
|
void MainWindow::dragEnterEvent(QDragEnterEvent *event)
|
|
{
|
|
if (event->mimeData()->hasUrls())
|
|
{
|
|
event->acceptProposedAction();
|
|
}
|
|
}
|
|
|
|
void MainWindow::dropEvent(QDropEvent *event)
|
|
{
|
|
const QMimeData* mimeData = event->mimeData();
|
|
if (mimeData->hasUrls())
|
|
{
|
|
QList<QUrl> urlList = mimeData->urls();
|
|
if (urlList.length() == 1)
|
|
{
|
|
QString fileName = urlList.first().toLocalFile();
|
|
if (!fileName.isEmpty())
|
|
{
|
|
loadTextFile(fileName);
|
|
}
|
|
}
|
|
}
|
|
}
|