QTableView练习实践00

#ifndef TABLEVIEWTEST_H
#define TABLEVIEWTEST_H

#include 
#include 
#include 
#include 
#include 

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 
#include 

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 

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TableViewTest w;
    w.show();
    return a.exec();
}

QTableView练习实践00_第1张图片

你可能感兴趣的:(qt杂记,qt)