当前位置: 首页 > article >正文

Qt 实战(10)模型视图 | 10.6、自定义 QTableView

文章目录

  • 一、自定义QTableView
    • 1、自定义模型
    • 2、自定义代理
    • 3、示例

一、自定义QTableView

1、自定义模型

模型中存储表格要显示的数据,要自定义一个QAbstractTableModel,需要从该类派生一个新的类,并在其中实现一些关键的方法。这些方法定义了模型如何与表格视图交互,包括数据的获取、行列的数量、数据项的修改等。如下:

// MyModel.h
#include <QAbstractTableModel>

class MyModel : public QAbstractTableModel
{
    Q_OBJECT

public:
    explicit MyModel(QObject *parent = nullptr);
    ~MyModel();

public:
    // 必须要实现的基类虚函数
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

    // 选择实现的虚函数
    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
    Qt::ItemFlags flags(const QModelIndex &index) const override;
    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

private:
    // 自定义方法
    void InitData();

private:
    QVector<QString> m_headers;
    QVector<QVector<QString>> m_data;
};

2、自定义代理

如果需要自定义单元格的渲染或编辑方式,可以创建一个自定义的代理类。委托类通常继承自QStyledItemDelegateQItemDelegate。当单击单元格时,代理控件会显示出来,编辑结束就会被隐藏起来,如果希望在编辑结束不要隐藏,必须要继承并重写QStyledItemDelegatepaint函数,相当于在单元格上完全自绘图形(当然QT也提供了一些辅助类,帮你快速画出一些常见控件)。

场景:代理提供QSpinBox控件,当编辑结束,希望单元格会显示进度条。

  • 创建代理
// MyScoreDelegate.cpp
void MyScoreDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    int progress = index.data().toInt();

    QStyleOptionProgressBar progressBarOption;
    progressBarOption.initFrom(option.widget);
    progressBarOption.progress = progress;
    progressBarOption.text = QString::number(progress) + "/100";
    progressBarOption.textAlignment = Qt::AlignHCenter;
    progressBarOption.rect = option.rect;
    progressBarOption.minimum = 0;
    progressBarOption.maximum = 100;
    progressBarOption.textVisible = true;

    QApplication::style()->drawControl(QStyle::CE_ProgressBar,
        &progressBarOption, painter);
}
  • 设置代理
void MyWidget::InitDelegate()
{
    MyLineEditDelegate *pLineEditDelaget = new MyLineEditDelegate();
    MySexComboxDelegate *pSexDelegate = new MySexComboxDelegate();
    MyScoreDelegate *pScoreDelegate = new MyScoreDelegate();

    ui.m_pTableView->setItemDelegate(pLineEditDelaget);
    ui.m_pTableView->setItemDelegateForColumn(eSexIndex, pSexDelegate);
    ui.m_pTableView->setItemDelegateForColumn(eScoreIndex, pScoreDelegate);
}

3、示例

下面是运行效果,源码参考附件

在这里插入图片描述


http://www.kler.cn/a/376214.html

相关文章:

  • 什么是无限钱包系统?有什么优势?
  • Day22 opencv图像预处理
  • redis分布式锁在项目中的应用总结
  • C语言——八股文(笔试面试题)——持续更新
  • 【每日C/C++问题】
  • C++STL——list
  • [MRCTF2020]PYWebsite1
  • jenkins 构建报错 Cannot run program “sh”
  • Uniapp的H5以及App不支持后端传FormData类型参数的解决方案
  • C#笔记——委托(2)
  • 浅谈人工智能之DB-GPT环境安装
  • SpringBoot3使用MyBatisPlus时遇到的问题 Invalid bean definition with name
  • python编程-类的特殊方法
  • Rust 力扣 - 2653. 滑动子数组的美丽值
  • 使用Docker Compose搭建多服务应用
  • Matlab车牌识别课程设计报告模板(附源代码)
  • Flutter鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
  • layui tree customSelet选中的内容重写,查找父级
  • Flume的安装配置
  • 服务器文件访问协议
  • go语言回调函数的使用
  • 免杀对抗—反VT沙盒虚拟机反调试进程APC注入
  • LeetCode 3165. 不包含相邻元素的子序列的最大和
  • nginx的基本安装与服务器配置
  • 驱动TFT-1.44寸屏(ST7735)显示器
  • 【面试】数组中 Array.forEach()、Array.map() 遍历结束后是否改变原数组