qt表格模型视图

Qt 提供了一套强大的模型/视图框架,允许你以一种非常灵活和高效的方式显示和处理数据。在 Qt 中,表格视图(TableView)和模型(TableModel)是这种框架的一部分,常用于显示和编辑表格数据。

以下是一些基本的概念和步骤,帮助你理解如何在 Qt 中使用表格模型和视图:

  1. 模型(Model)

    模型是数据的抽象表示。在 Qt 中,模型负责存储数据,并提供一种方式来访问这些数据。QAbstractTableModel 是一个常用的基类,用于创建自定义的表格模型。

  2. 视图(View)

    视图是模型的可视化表示。QTableView 是一个表格视图,显示模型中的数据,并允许用户与数据进行交互。

  3. 代理(Delegate)

    代理用于自定义视图中的单元格的显示和编辑方式。QStyledItemDelegate 或自定义的 QItemDelegate 可以用于此目的。

  4. 编辑器(Editor)

    编辑器是用于编辑单元格的组件。例如,QLineEdit 可以用于编辑文本。

  5. 选择模型(Selection Model)

    选择模型用于管理用户在视图中的选择。

cpp 复制代码
#include "mytablemodel.h"
#include <QtMath>
#include <QColor>

MyTableModel::MyTableModel(QObject *parent) : QAbstractTableModel(parent)
{
    m_columnNum=9;
}

void MyTableModel::setInitData(QList<CellInfo*>& data)
{
    //重置model数据之前调用beginResetModel,此时会触发modelAboutToBeReset信号
    beginResetModel();
    //重置model中的数据
    m_datas = data;
    m_rowNum = ceil(data.size()*1.0/m_columnNum);   //行数=数据总数/列数,然后向上取整
    //数据设置结束后调用endResetModel,此时会触发modelReset信号
    endResetModel();
}

int MyTableModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid()) {
        return 0;
    } else {
        return m_rowNum;
    }
}

int MyTableModel::columnCount(const QModelIndex &parent) const
{
    if (parent.isValid()) {
        return 0;
    } else {
        return m_columnNum;
    }
}

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid()) {
        return QVariant();
    }
    if(index.row()*m_columnNum+index.column() < m_datas.count())
    {
        if (role == Qt::DisplayRole ||  role == Qt::EditRole) {
            return m_datas[index.row()*m_columnNum+index.column()]->content;//数据的呈现形式
        }
        else if(role == Qt::BackgroundColorRole){
            return m_datas[index.row()*m_columnNum+index.column()]->bgColor;//单元格背景色
        }
        else if (role == Qt::TextAlignmentRole) {    //对其方式
            return Qt::AlignCenter;
        }
        else if(role == Qt::ToolTipRole){
            return m_datas[index.row()*m_columnNum+index.column()]->toolTip;//数据的提示信息
        }
        else if(role == Qt::UserRole)
        {
            return QVariant::fromValue(m_datas[index.row()*m_columnNum+index.column()]);
        }
    }
    return QVariant();
}

Qt::ItemFlags MyTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;
    return Qt::ItemIsEnabled|Qt::ItemIsSelectable|Qt::ItemIsEditable;
}

bool MyTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if(index.row()*m_columnNum+index.column() < m_datas.count())
    {
        if (index.isValid() && role == Qt::EditRole)
        {
            m_datas[index.row()*m_columnNum+index.column()]->content = value.value<QString>();
            emit dataChanged(index, index, QVector<int>() << role);                     //发送信号触发刷新
            return true;
        }
        if (index.isValid() && role == Qt::BackgroundColorRole)
        {
            m_datas[index.row()*m_columnNum+index.column()]->bgColor = value.value<QColor>();
            emit dataChanged(index, index, QVector<int>() << role);                     //发送信号触发刷新
            return true;
        }
    }
    return false;
}
相关推荐
我爱Jack12 分钟前
深入解析 LinkedList
java·开发语言
engchina23 分钟前
Python PDF处理库深度对比:PyMuPDF、pypdfium2、pdfplumber、pdfminer的关系与区别
开发语言·python·pdf
拓端研究室25 分钟前
专题:2025供应链数智化与效率提升报告|附100+份报告PDF、原数据表汇总下载
开发语言·php
一百天成为python专家1 小时前
python库之jieba 库
开发语言·人工智能·python·深度学习·机器学习·pycharm·python3.11
Go Dgg1 小时前
【Go + Gin 实现「双 Token」管理员登录】
开发语言·golang·gin
十五年专注C++开发2 小时前
hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
开发语言·数据库·c++·redis·缓存
WJ.Polar2 小时前
Python数据容器-集合set
开发语言·python
晓13132 小时前
JavaScript加强篇——第七章 浏览器对象与存储要点
开发语言·javascript·ecmascript
nbsaas-boot2 小时前
Go语言生态成熟度分析:为何Go还无法像Java那样实现注解式框架?
java·开发语言·golang
xiaocainiao8812 小时前
Python 实战:构建可扩展的命令行插件引擎
开发语言·python