Qt之QTableView的简单使用(含源码+注释)

一、QTableView操作示例图

下图为QTableView简单使用示例图,其中包含设置、获取、新建item等操作,源码在本文第三节(源码含详细注释)。
在这里插入图片描述
提示:不会使用Qt设计师设计界面的小伙伴点击这里

二、QTableView(个人理解)

  1. QTableView是类似MVC(Model View Controller)模式,但在这里的Controller变成了Delegate;
  2. 使用QTableView显示数据需要配合QStandardItemModel,但是其子类QTableWidget则不需要,但是QTableView的可操作性远高于QTableWidget;
  3. 上方说到QTableView的可操作高于QTableWidget,是因为QTableView包含Delegate(代理),Delegate是真正将控件添加到QTableView中的;如setIndexWidget()只是单纯将控件放在item上,当QTableView进行添加/删除操作时,setIndexWidget()的控件不会随着行列改变而改变位置,但通过Delegate设置的控件就不会受影响。
    提示:强烈推荐学习QTableView的小伙伴了解Delegate(代理),请查看Qt代理的实现(按钮篇)Qt代理的实现(常规控件篇)

三、源码

CMainWindow.h

#ifndef CMAINWINDOW_H
#define CMAINWINDOW_H

#include <QMainWindow>
#include <QStandardItemModel>   //数据模型类

namespace Ui {
class CMainWindow;
}

class CMainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit CMainWindow(QWidget *parent = 0);
    ~CMainWindow();

private slots:
    //获取指定位置的值
    void on_getIndexDataBtn_clicked();

    //设置指定位置的值
    void on_setIndexDataBtn_clicked();

private:
    Ui::CMainWindow     *ui;

    QStandardItemModel  *m_pModel;  //数据模型对象指针
};

#endif // CMAINWINDOW_H

CMainWindow.cpp

#include "CMainWindow.h"
#include "ui_CMainWindow.h"

CMainWindow::CMainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CMainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("QTableView简单使用");

    //建立模型对象空间并指定父对象
    m_pModel = new QStandardItemModel(ui->tableView);
    //将数据模型设置到表对象上
    ui->tableView->setModel(m_pModel);

    //! 添加数据(添加数据包含多种方式),我个人主要使用如下几个函数
    //! 添加指定位置的item: void QStandardItemModel::setItem(int row, int column, QStandardItem *item)
    //! 添加指定行首列的item: void QStandardItemModel::setItem(int row, QStandardItem *item)
    //! 追加一列: void appendColumn(const QList<QStandardItem *> &items)
    //! 追加一行: void appendRow(const QList<QStandardItem *> &items)

    //循环添加三行数据
    for(int index = 0; index != 3; ++index)
    {
        m_pModel->appendRow(QList<QStandardItem *>()
                            << new QStandardItem(QString("第%1行,第0列").arg(index))
                            << new QStandardItem(QString("第%1行,第1列").arg(index)));
    }

    //添加指定位置的数据
    m_pModel->setItem(3, 2, new QStandardItem(QString("第3行,第2列")));
}

CMainWindow::~CMainWindow()
{
    //! 析构函数:
    //! 有些小伙伴会发现我没有析构model对象,
    //! 那是因为我在获取对象空间的时候指定了父对象,
    //! 当其父对象析构时,会先析构其子对象为指针的对象。
    delete ui;
}

void CMainWindow::on_getIndexDataBtn_clicked()
{
    //通过行、列编辑栏获取指定位置的item指针
    QStandardItem *item = m_pModel->item(ui->rowEdit->text().toInt()
                                         , ui->columnEdit->text().toInt());
    //判断指针是否为空,为空则设置提示并返回
    if(nullptr == item)
    {
        ui->valueEdit->setText("指定的item不存在");
        return;
    }

    //获取item的值并设置到值编辑框中
    ui->valueEdit->setText(item->text());

}

void CMainWindow::on_setIndexDataBtn_clicked()
{
    //通过行、列编辑栏获取指定位置的item指针
    QStandardItem *item = m_pModel->item(ui->rowEdit->text().toInt()
                                         , ui->columnEdit->text().toInt());
    //判断指针是否为空
    if(nullptr == item)
    {
        //为空则新建item设置到数据模型对象中
        m_pModel->setItem(ui->rowEdit->text().toInt()
                          , ui->columnEdit->text().toInt()
                          , new QStandardItem(ui->valueEdit->text()));
    }
    else
    {
        //不为空则直接获取值设置到item中
        item->setText(ui->valueEdit->text());
    }
}

四、拓展:代理的使用

代理的使用步骤:

  1. 创建代理对象指针
  2. 连接信号槽
  3. 设置代理位置
    提示:设置好后在其设置的位置会自动创建代理控件(常规控件需要双击调用)
//new出代理对象,并设置到相应列
    m_delegate = new CButtonDelegate;
    connect(m_delegate, &CButtonDelegate::clicked, this, &CMainWindow::on_itemClick);   //连接槽函数
    ui->tableView->setItemDelegateForColumn(2, m_delegate);

总结

虽然QTableView使用稍微繁琐,但是QTableView比QTableWidget灵活度更高,我个人建议尽量使用QTableView。对于代理,要是能掌握更好,因为其不但能提供不同控件,并且提供的控件不model的行列变化影响。
最后,好久不见,继续加油吧!

相关文章

Qt代理的实现(按钮篇,含源码+注释)
Qt代理的实现(常规控件篇,含源码+注释)
Qt之QTableView设置多列表头复选框(自定义QHeaderView)、单元格复选框(含源码+注释)
Qt之QSortFilterProxyModel的简单使用(QTableView搜索功能,含源码+注释)
Qt之QTreeView的简单使用(含源码+注释)
Qt之QListView的简单使用(含源码+注释)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

  • 22
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
QtQTableView中添加复选框可以通过自定义QAbstractItemDelegate来实现。 首先,我们需要创建一个继承于QAbstractItemDelegate的代理类。在该类中,我们需要重写创建编辑器和更新模型数据的方法。为了在单元格中显示复选框,我们可以使用QCheckBox作为编辑器。 QCheckBox* checkBox = new QCheckBox(); checkBox->setCheckState(index.data(Qt::DisplayRole).toBool() ? Qt::Checked : Qt::Unchecked); // 获取当前单元格数据的布尔值,并设置复选框的选中状态 接下来,我们需要重写setValue和setEditorData方法,用于将复选框的状态应用到模型数据中。 void CheckBoxDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const { QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor); if (!checkBox) return; bool value = index.model()->data(index, Qt::DisplayRole).toBool(); checkBox->setCheckState(value ? Qt::Checked : Qt::Unchecked); } void CheckBoxDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { QCheckBox* checkBox = qobject_cast<QCheckBox*>(editor); if (!checkBox) return; bool value = (checkBox->checkState() == Qt::Checked); model->setData(index, value, Qt::EditRole); } 接下来,我们需要在QTableView中设置我们的代理类。在创建QTableView实例后,调用setItemDelegateForColumn方法,将该列的代理设置为我们的CheckBoxDelegate实例。 CheckBoxDelegate* delegate = new CheckBoxDelegate(this); tableView->setItemDelegateForColumn(columnIndex, delegate); 现在,我们的QTableView中的指定列应该显示为复选框。当用户点击复选框时,数据将根据用户的选择自动更新到模型中。 需要注意的是,在创建代理类之前,我们需要在模型中将对应的数据列设置为布尔值类型。 通过自定义QAbstractItemDelegate并结合QCheckBox,我们可以轻松地在QTableView中添加复选框。这样,我们就可以方便地实现复选框功能并与模型数据交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lw向北.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值