【QT】表格操作QTableView详解

该博客介绍了如何在Qt环境中通过QStandardItemModel创建和格式化一个10行2列的表格。首先,在mainwindow.ui界面中添加TableView控件,然后定义表格格式,包括设置表头为'温度'和'热膨胀系数',并调整字体样式。接着,填充表格内容,设置单元格元素居中,并隐藏行号。最后,固定每列宽度为274像素。整个过程详细展示了Qt界面设计和数据绑定的过程。
摘要由CSDN通过智能技术生成

1.创建:ui界面拖拉创建

mainwindow.ui页面上找到Table View控件:

在这里插入图片描述

然后拖拉到指定位置

2.定义表格的格式

头文件:

#include <QTableView>
#include <QStandardItemModel>

model(表格格式)定义为10行2列

QStandardItemModel* model = new QStandardItemModel(10,2); 

给model 设置表头:

QStringList labels = QObject::trUtf8("温度,热膨胀系数").simplified().split(",");
model->setHorizontalHeaderLabels(labels);

QTableView设置QStandardItemModel

ui->TableView->setModel(model);

设置表格字体格式

ui->table->horizontalHeader()->setStyleSheet("QHeaderView::section {"
                           "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");

设置表格内的元素:
setItem(行号,列号,item变量)

QStandardItem* item = 0;
    for(int i = 0;i <= 9; i++){
   	 // 给item赋值
        item = new QStandardItem(QString("%1").arg(i));
        // 表格内元素设置字体居中
        item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        // 设置表格单元格内容
        model->setItem(i,0,item);
    }

隐藏表格的行号

ui->table->verticalHeader()->hide();

指定表格的固定列宽

for(int i = 0; i < ui->table->horizontalHeader()->count(); i++)
{
      ui->table->setColumnWidth(i,274);
}

3.综合

//表格设置 
   QStandardItemModel* m_model;
    m_model = new QStandardItemModel(10,2);
    QStringList labels = QObject::trUtf8("温度,热膨胀系数").simplified().split(",");
    m_model->setHorizontalHeaderLabels(labels);
    ui->table->setModel(m_model);
    ui->table->horizontalHeader()->setStyleSheet("QHeaderView::section {"
                                                           "color: black;padding-left: 4px;border: 1px solid #6c6c6c;}");
    //定义item
    QStandardItem* item = 0;
    for(int i = 16;i <= 25; i++){
        item = new QStandardItem(QString("%1").arg(i));
        item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
        m_model->setItem(i-16,0,item);
    }


    ui->table->verticalHeader()->hide();
    for(int i = 0; i < ui->table->horizontalHeader()->count(); i++)
    {
        ui->table->setColumnWidth(i,274);
    }
要实现QTableView操作的撤销回退,可以使用Qt的Undo Framework。Undo Framework是一个用于实现撤销/重做操作的框架,可以轻松地为QTableView添加撤销/重做功能。 首先,你需要创建一个QStandardItemModel或者继承自QAbstractTableModel的模型,并在其中实现你的数据操作。然后,在你的窗口类中添加一个QUndoStack对象,该对象将用于保存所有的操作记录,以便进行撤销和重做。 下一步是在QTableView上设置撤销/重做操作。为此,需要重写QAbstractItemView中的keyPressEvent()方法,并在其中捕获Ctrl+Z和Ctrl+Y键。当用户按下Ctrl+Z时,你需要从QUndoStack中取出最近的操作,并执行相应的撤销操作,以便撤消它。当用户按下Ctrl+Y时,你需要从QUndoStack中取出最近的已撤销操作,并执行相应的重做操作,以便再次执行它。 这里是一个示例代码: ```cpp // MyTableModel.h #include <QStandardItemModel> #include <QUndoStack> class MyTableModel : public QStandardItemModel { public: MyTableModel(QObject *parent = nullptr); // 实现你的数据操作函数 ... // 撤销/重做操作 void undo(); void redo(); private: QUndoStack *m_undoStack; }; // MyTableModel.cpp MyTableModel::MyTableModel(QObject *parent) : QStandardItemModel(parent) { m_undoStack = new QUndoStack(this); } void MyTableModel::undo() { m_undoStack->undo(); } void MyTableModel::redo() { m_undoStack->redo(); } // 重写QAbstractItemView中的keyPressEvent()方法 void MyTableView::keyPressEvent(QKeyEvent *event) { if (event->matches(QKeySequence::Undo)) { m_model->undo(); } else if (event->matches(QKeySequence::Redo)) { m_model->redo(); } else { QTableView::keyPressEvent(event); } } // MyWindow.h #include <QWidget> #include <QTableView> #include "MyTableModel.h" class MyWindow : public QWidget { public: MyWindow(QWidget *parent = nullptr); private: QTableView *m_tableView; MyTableModel *m_model; }; // MyWindow.cpp MyWindow::MyWindow(QWidget *parent) : QWidget(parent) { m_model = new MyTableModel(this); m_tableView = new QTableView(this); m_tableView->setModel(m_model); // 设置撤销/重做快捷键 QShortcut *undoShortcut = new QShortcut(QKeySequence::Undo, this); connect(undoShortcut, &QShortcut::activated, m_model, &MyTableModel::undo); QShortcut *redoShortcut = new QShortcut(QKeySequence::Redo, this); connect(redoShortcut, &QShortcut::activated, m_model, &MyTableModel::redo); } ``` 这里只是一个简单的示例代码,你可以根据你的需求修改它。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值