#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); 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 urlList = mimeData->urls(); if (urlList.length() == 1) { QString fileName = urlList.first().toLocalFile(); if (!fileName.isEmpty()) { loadTextFile(fileName); } } } }