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;
}
相关推荐
侃侃_天下3 天前
最终的信号类
开发语言·c++·算法
echoarts3 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix3 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题3 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说3 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔3 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号3 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_3 天前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty3 天前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再3 天前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame