| #include "mainwindow.h" |
| #include "ui_mainwindow.h" |
| |
| #include <QAbstractItemView> |
| #include <QFileDialog> |
| #include <QFileDialog> |
| #include <QTextStream> |
| |
| MainWindow::MainWindow(QWidget *parent) |
| : QMainWindow(parent) |
| , ui(new Ui::MainWindow) |
| { |
| ui->setupUi(this); |
| |
| labelPath = new QLabel("当前文件:", this); |
| labelPath->setMinimumWidth(225); |
| labelCellPos = new QLabel("当前位置:", this); |
| labelCellPos->setMinimumWidth(75); |
| labelCellText = new QLabel("当前内容:", this); |
| labelCellText->setMinimumWidth(150); |
| ui->statusbar->addWidget(labelPath); |
| ui->statusbar->addWidget(labelCellPos); |
| ui->statusbar->addWidget(labelCellText); |
| |
| model = new QStandardItemModel(10, COL, this); |
| selectModel = new QItemSelectionModel(model); |
| ui->tableView->setModel(model); |
| ui->tableView->setSelectionModel(selectModel); |
| ui->tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); |
| ui->tableView->setSelectionBehavior(QAbstractItemView::SelectItems); |
| |
| connect(selectModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(on_currentChanged(QModelIndex, QModelIndex))); |
| } |
| |
| MainWindow::~MainWindow() |
| { |
| delete ui; |
| } |
| |
| void MainWindow::on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous) |
| { |
| Q_UNUSED(previous); |
| if (!current.isValid()) { |
| return; |
| } |
| labelCellPos->setText(QString("第 %1 行,第 %2 列").arg(current.row()).arg(current.column())); |
| QStandardItem *item = model->itemFromIndex(current); |
| labelCellText->setText("当前单元格内容:" + item->text()); |
| QFont font = item->font(); |
| ui->actFontBold->setChecked(font.bold()); |
| } |
| |
| |
| void MainWindow::on_actOpen_triggered() |
| { |
| QString curPath = QCoreApplication::applicationDirPath(); |
| QString name = QFileDialog::getOpenFileName(this, "打开文件", curPath, "文本文件(*.txt);;所有文件(*.*)"); |
| if (name.isEmpty()) { |
| return; |
| } |
| QStringList list; |
| |
| QFile file(name); |
| if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { |
| ui->plainTextEdit->clear(); |
| QTextStream stream(&file); |
| while (!stream.atEnd()) { |
| QString lineText = stream.readLine(); |
| ui->plainTextEdit->appendPlainText(lineText); |
| list.append(lineText); |
| } |
| this->labelPath->setText("当前文件:" + curPath); |
| |
| initItemModel(list); |
| ui->tableView->resizeRowsToContents(); |
| ui->tableView->resizeColumnsToContents(); |
| |
| ui->actSave->setEnabled(true); |
| ui->actInsert->setEnabled(true); |
| ui->actAppend->setEnabled(true); |
| ui->actDelete->setEnabled(true); |
| } |
| } |
| |
| |
| |
| |
| |
| void MainWindow::initItemModel(QStringList list) |
| { |
| model->setRowCount(list.size() - 1); |
| QString header = list.at(0); |
| QStringList headerList = header.split(QRegExp("\\s+"), QString::SkipEmptyParts); |
| model->setHorizontalHeaderLabels(headerList); |
| |
| for (int i = 1; i < list.count(); i++) { |
| int j = 0; |
| QStringList contents = list.at(i).split(QRegExp("\\s+"), QString::SkipEmptyParts); |
| for (; j < COL - 1; j++) { |
| QStandardItem *item = new QStandardItem(contents.at(j)); |
| model->setItem(i - 1, j, item); |
| } |
| QStandardItem *checkItem = new QStandardItem(); |
| checkItem->setCheckState(contents.at(j) == "1" ? Qt::Checked : Qt::Unchecked); |
| model->setItem(i - 1, j, checkItem); |
| } |
| } |
| |
| void MainWindow::on_actSave_triggered() |
| { |
| QString curPath = QCoreApplication::applicationDirPath(); |
| QString name = QFileDialog::getSaveFileName(this, "数据信息保存", curPath, "文本文件(*.txt)"); |
| if (name.isEmpty()) { |
| return; |
| } |
| QFile file(name); |
| if (file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) { |
| QTextStream stream(&file); |
| stream.setCodec("UTF-8"); |
| ui->plainTextEdit->clear(); |
| QString str = ""; |
| for (int i = 0; i < model->columnCount(); i++) { |
| QStandardItem *item = model->horizontalHeaderItem(i); |
| str += (item->text() + "\t\t"); |
| } |
| stream << str << "\n"; |
| ui->plainTextEdit->appendPlainText(str); |
| QString text = ""; |
| for (int i = 0; i < model->rowCount(); i++) { |
| int j = 0; |
| for (; j < model->columnCount() - 1; j++) { |
| text += model->item(i, j)->text() + "\t\t"; |
| } |
| text += model->item(i, j)->checkState() == Qt::Checked ? "1\n" : "0\n"; |
| } |
| stream << text; |
| stream.flush(); |
| } |
| } |
| |
| void MainWindow::on_actAppend_triggered() |
| { |
| QList<QStandardItem *>itemList; |
| for (int i = 0; i < model->columnCount() - 1; i++) { |
| QStandardItem *item = new QStandardItem("0"); |
| itemList << item; |
| } |
| |
| QStandardItem *item = new QStandardItem("1"); |
| item->setCheckState(Qt::Checked); |
| itemList << item; |
| model->appendRow(itemList); |
| |
| |
| selectModel->clear(); |
| QModelIndex index = model->index(model->rowCount() - 1, 0); |
| selectModel->setCurrentIndex(index, QItemSelectionModel::Rows); |
| } |
| |
| void MainWindow::on_actInsert_triggered() |
| { |
| QList<QStandardItem *>itemList; |
| for (int i = 0; i < model->columnCount() - 1; i++) { |
| QStandardItem *item = new QStandardItem("0"); |
| itemList << item; |
| } |
| |
| QStandardItem *item = new QStandardItem("1"); |
| item->setCheckState(Qt::Checked); |
| itemList << item; |
| int row = selectModel->currentIndex().row(); |
| model->insertRow(row, itemList); |
| |
| selectModel->clear(); |
| QModelIndex index = model->index(row, 0); |
| selectModel->setCurrentIndex(index, QItemSelectionModel::Select); |
| } |
| |
| void MainWindow::on_actDelete_triggered() |
| { |
| QModelIndex index = selectModel->currentIndex(); |
| model->removeRow(index.row()); |
| if (index.row() >= model->rowCount()) { |
| index = model->index(model->rowCount() - 1, 0); |
| } |
| selectModel->setCurrentIndex(index, QItemSelectionModel::Select); |
| } |
| |
| void MainWindow::setTextAlign(Qt::Alignment atextAlignment) |
| { |
| if (selectModel->hasSelection()) { |
| QModelIndexList selectList = selectModel->selectedIndexes(); |
| for (int i = 0; i < selectList.count(); i++) { |
| QModelIndex index = selectList[i]; |
| QStandardItem *item = model->itemFromIndex(index); |
| item->setTextAlignment(atextAlignment); |
| } |
| } |
| } |
| |
| void MainWindow::on_actAlignLeft_triggered() |
| { |
| setTextAlign(Qt::AlignLeft); |
| } |
| |
| void MainWindow::on_actAlignCenter_triggered() |
| { |
| setTextAlign(Qt::AlignCenter); |
| } |
| |
| void MainWindow::on_actAlignRight_triggered() |
| { |
| setTextAlign(Qt::AlignRight); |
| } |
| |
| void MainWindow::on_actFontBold_triggered(bool checked) |
| { |
| if (selectModel->hasSelection()) { |
| QModelIndexList selectList = selectModel->selectedIndexes(); |
| for (int i = 0; i < selectList.count(); i++) { |
| QModelIndex index = selectList[i]; |
| QStandardItem *item = model->itemFromIndex(index); |
| QFont font = item->font(); |
| font.setBold(checked); |
| item->setFont(font); |
| } |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-03-16 C# 自定义时间进度条