From eb351c0fa1d058e876e54efad26785e63035c920 Mon Sep 17 00:00:00 2001 From: Crimson Date: Tue, 20 Jun 2023 22:15:15 +0800 Subject: [PATCH] first comit --- TabEditor.pro | 26 ++++++++ app.ico | Bin 0 -> 30951 bytes fileloader.h | 21 +++++++ main.cpp | 12 ++++ mainwindow.cpp | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ mainwindow.h | 30 ++++++++++ mainwindow.ui | 62 +++++++++++++++++++ 7 files changed, 309 insertions(+) create mode 100644 TabEditor.pro create mode 100644 app.ico create mode 100644 fileloader.h create mode 100644 main.cpp create mode 100644 mainwindow.cpp create mode 100644 mainwindow.h create mode 100644 mainwindow.ui diff --git a/TabEditor.pro b/TabEditor.pro new file mode 100644 index 0000000..d86baaa --- /dev/null +++ b/TabEditor.pro @@ -0,0 +1,26 @@ +QT += core gui + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +CONFIG += c++17 + +# You can make your code fail to compile if it uses deprecated APIs. +# In order to do so, uncomment the following line. +#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 + +SOURCES += \ + main.cpp \ + mainwindow.cpp + +HEADERS += \ + mainwindow.h + +FORMS += \ + mainwindow.ui + +RC_ICONS += app.ico + +# Default rules for deployment. +qnx: target.path = /tmp/$${TARGET}/bin +else: unix:!android: target.path = /opt/$${TARGET}/bin +!isEmpty(target.path): INSTALLS += target diff --git a/app.ico b/app.ico new file mode 100644 index 0000000000000000000000000000000000000000..657d7aa3388573693255cc8f4d59bee85b594490 GIT binary patch literal 30951 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 literal 0 HcmV?d00001 diff --git a/fileloader.h b/fileloader.h new file mode 100644 index 0000000..db556d8 --- /dev/null +++ b/fileloader.h @@ -0,0 +1,21 @@ +// fileloader.h +#ifndef FILELOADER_H +#define FILELOADER_H + +#include + +class FileLoader : public QObject +{ + Q_OBJECT +public: + explicit FileLoader(QObject *parent = nullptr); + ~FileLoader(); + +public slots: + void loadTextFile(const QString& fileName); + +signals: + void fileLoaded(QStringList rows, int tableCol); +}; + +#endif // FILELOADER_H diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..53448f2 --- /dev/null +++ b/main.cpp @@ -0,0 +1,12 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.setWindowTitle("TabEditor"); + w.show(); + return a.exec(); +} diff --git a/mainwindow.cpp b/mainwindow.cpp new file mode 100644 index 0000000..7bf71e6 --- /dev/null +++ b/mainwindow.cpp @@ -0,0 +1,158 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include +#include +#include +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + connect(ui->actionOpen, &QAction::triggered, this, &MainWindow::onOpenButtonClicked); + connect(ui->actionSave, &QAction::triggered, this, &MainWindow::onSaveButtonClicked); +} + +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, "保存完成", "文件已成功保存。"); + } + } +} diff --git a/mainwindow.h b/mainwindow.h new file mode 100644 index 0000000..74878dc --- /dev/null +++ b/mainwindow.h @@ -0,0 +1,30 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include "qprogressdialog.h" +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + void loadTextFile(const QString& fileName); + +private slots: + void onOpenButtonClicked(); + void onSaveButtonClicked(); + +private: + Ui::MainWindow *ui; + QProgressDialog* progressDialog; // 添加进度对话框指针 +}; +#endif // MAINWINDOW_H diff --git a/mainwindow.ui b/mainwindow.ui new file mode 100644 index 0000000..3df9490 --- /dev/null +++ b/mainwindow.ui @@ -0,0 +1,62 @@ + + + MainWindow + + + + 0 + 0 + 1400 + 800 + + + + MainWindow + + + + Qt::LeftToRight + + + + + + + + + + + + + + + 0 + 0 + 1400 + 21 + + + + + File + + + + + + + + + + Open + + + + + Save + + + + + +