#ifndef TABLEVIEWTEST_H
#define TABLEVIEWTEST_H
#include <QMainWindow>
#include <QAbstractTableModel>
#include <QStandardItemModel>
#include <vector>
#include <QContextMenuEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class TableViewTest; }
QT_END_NAMESPACE
class TableViewTest : public QMainWindow
{
Q_OBJECT
public:
TableViewTest(QWidget *parent = nullptr);
~TableViewTest();
void TableViewInit();
void CreateTable();
void deleteTableRow(int rowIndex);
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
private slots:
void onDataChanged(const QModelIndex &index);
void deleteTableRowByMouse(const QModelIndex &index);
private:
Ui::TableViewTest *ui;
QStandardItemModel *m_model;
};
#endif // TABLEVIEWTEST_H
#include "tableviewtest.h"
#include "ui_tableviewtest.h"
#include <QDebug>
#include <QSettings>
QStringList tableViewHeadTitle = {
"年纪","班级", "ID", "姓名", "年龄", "身高", "体重",
};
TableViewTest::TableViewTest(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::TableViewTest)
{
ui->setupUi(this);
TableViewInit();
}
TableViewTest::~TableViewTest()
{
delete ui;
}
void TableViewTest::CreateTable()
{
static int rows = 0;
quint8 column = 0;
for (; column < tableViewHeadTitle.size(); ++ column) {
m_model->setItem(rows, column, new QStandardItem(Qt::AlignCenter));
}
rows++;
ui->tableView->scrollToBottom();
m_model->insertRow(m_model->rowCount());
m_model->setData(m_model->index(m_model->rowCount() - 1, 0), "");
}
void TableViewTest::TableViewInit()
{
m_model = new QStandardItemModel(this);
m_model->clear();
// 设置表格标题
m_model->setHorizontalHeaderLabels(tableViewHeadTitle);
// 绑定model
QTableView *table = ui->tableView;
table->setModel(m_model);
// 设置滚动条自动滚动
table->setAutoScroll(true);
// 设置表格样式
table->setAlternatingRowColors(true);
// 单元格布局方式
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// groupBox边框样式设置
ui->groupBox->setStyleSheet("QGroup#groupBox{border: 1px solid red; border-left: none; border-right: none; padding: 10px}");
// 隐藏table边框
table->setStyleSheet("QTableView#table {border: none}");
// 在表头下方添加分割线
table->horizontalHeader()->setStyleSheet("QHeaderView::section{border-left:0px, solid, white; border-right: 0px, solid, white; border-bottom: 2px solid white; background-color: white; padding: 1px}");
// 监听数据变化
connect(m_model, &QStandardItemModel::dataChanged, this, &TableViewTest::onDataChanged);
// 连接 QTableView::clicked 信号和 deleteTableRowByMouse 槽函数
connect(table, &QTableView::clicked, this, &TableViewTest::deleteTableRowByMouse);
}
void TableViewTest::contextMenuEvent(QContextMenuEvent *event)
{
qDebug() << "void TableViewTest::contextMenuEvent(QContextMenuEvent *event)" << endl;
QMenu menu(this);
QAction *addRowAction = new QAction(tr("新增一行"));
QAction *delRowAction = new QAction(tr("删除本行"));
connect(addRowAction, &QAction::triggered, this, [&](){
m_model->insertRow(m_model->rowCount());
});
connect(delRowAction, &QAction::triggered, this, [&](){
QModelIndex index = ui->tableView->currentIndex();
if(index.isValid()) {
m_model->removeRow(index.row());
}
});
menu.addAction(addRowAction);
menu.addAction(delRowAction);
menu.exec(event->globalPos());
}
void TableViewTest::onDataChanged(const QModelIndex &index)
{
// 获取编辑完成后的内容
QString newValue = m_model->data(index, Qt::DisplayRole).toString();
// 根据行列号计算所在行
int row = index.row();
// 将一行数据保存到 INI 文件中
QSettings settings("testdata.ini", QSettings::IniFormat);
QString rowName = QString("Row%1").arg(row);
settings.beginGroup(rowName);
for (int col = 0; col < tableViewHeadTitle.size(); ++col) {
QString key = tableViewHeadTitle[col];
QVariant value = m_model->index(row, col).data();
settings.setValue(key, value);
}
settings.endGroup();
}
void TableViewTest::deleteTableRow(int rowIndex)
{
// 从 INI 文件中删除对应的行数据
QSettings settings("testdata.ini", QSettings::IniFormat);
QString rowName = QString("Row%1").arg(rowIndex);
settings.remove(rowName);
// 删除表格中的行
int rowCount = m_model->rowCount();
if (rowIndex >= 0 && rowIndex < rowCount) {
m_model->removeRow(rowIndex);
}
}
void TableViewTest::deleteTableRowByMouse(const QModelIndex &index)
{
// 获取要删除的行索引
int rowIndex = index.row();
// 删除表格行并同步删除 INI 文件中的行数据
deleteTableRow(rowIndex);
}
#include "tableviewtest.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TableViewTest w;
w.show();
return a.exec();
}