首页 > 其他分享 >Qt-Model/View综合示例

Qt-Model/View综合示例

时间:2024-04-29 22:22:46浏览次数:14  
标签:QHeaderView Qt 示例 单元格 表头 设置 model Model

相关类简介

Qt和Model/View模式相关的类比较多, 但一般存在继承关系, 按model(模型), view(视图), delegate(委托)划分为如下几种:

类型 类名 简介 父类
model
QAbstractItemModel (抽象类)常用的Model的基类 QObject
QStandardItemModel 通用model可以实现以下任意类型的功能 QAbstractItemModel
QAbstractTableModel (抽象类)缺省为二维
主要为 QTableView提供数据
QAbstractItemModel
QAbstractListModel (抽象类)缺省为一维, 单列数据结构(其实现对应QML中的ListModel)
其实现常用于为QListView提供数据, 或为QML中Repeater等提供数据
子类: QStringListModel
QAbstractItemModel
QStringListModel 用于处理字符串列表的数据模型
常用于为QListView提供数据
QAbstractListModel
QFileSystemModel 类似文件结构(目录树)的model
常用于为QTreeView提供数据
QAbstractItemModel
QDirModel 目录结构, 为QTreeView提供数据 QAbstractItemModel
...
view
QAbstractItemView (抽象类)派生关系: QWidget->QFrame->QAbstractScrollArea QAbstractScrollArea
QListView 单方向(一维)列表控件 QAbstractItemView
QTableView 平面(二维)列表控件
构建方式: 用setModel绑定到数据源构建, 单元格一般为文本
其它特性: 支持绑定QSqlTableModel
QAbstractItemView
QTableWidget 同上, 但单元格得到了扩展, 不能使用setModel绑定
构建方式: 不能调用setModel绑定数据源, 只能使用QTableWidgetItem
进行单元格构建, 单元格中可同时放入文本和控件
QTableView
QTreeView 树形结构控件 QAbstractItemView
...
delegate
QAbstractItemDelegate (抽象类)委托的基类 QObject
QItemDelegate 自定义绘制 QAbstractItemDelegate
QStyledItemDelegate (>Qt 4.4版本)默认委托, 加载当前默认style绘制, 一般使用这个类较多. QAbstractItemDelegate
其他 QItemSelectionModel 用于保存当前model被选中的部分:
QItemSelectionModel* selections = m_tableView->selectionModel();
主要方法:
QModelIndexList selectedIndexes();//获取当前选择了多少item
QModelIndexList selectedRows(0);//获取当前(第0列)选择了多少行

QObject
QHeaderView QTableView的表头, 有两个, 一个横向, 一个纵向, 当我们想实现自定义的
表头时, 需要继承该类实现自定义部分, 如: 常见场景是在横向表头的第一
列加一个全选框.
QAbstractItemView

类举例详细介绍

以QAbstractTableModel, QTableView, QStyledItemDelegate举例

QAbstractTableModel

必须实现的虚函数

  • rowCount 返回表格多少行
  • columnCount 返回表格多少列
  • data 返回单元格数据(参数: 单元格索引, 单元格角色(显示, tips, 编辑等), 返回值: 该单元格对应角色的内容)

其它常用接口

  • setData 更新数据

  • sort 排序

  • flags 返回item的标志项, 常用来设置表格是否可选, 是否可以点击复选框

    //设置表格可点击复选框
    Qt::ItemFlags flags(const QModelIndex &index) const 
    {
        if (!index.isValid())
            return QAbstractItemModel::flags(index);
      
        Qt::ItemFlags flags = Qt::ItemIsEnabled | Qt::ItemIsSelectable;
        if (index.column() == 0)    //设置第一列能复选
            flags |= Qt::ItemIsUserCheckable;
      
        return flags;
    }
    

QTableView

必用接口

  • setModel(QAbstractItemModel *model); //设置数据源

常用接口

  • //resizeRowsToContents();//设置自动行高, model中数据量多时设置该选项会严重影响速度

  • resizeColumnsToContents();//设置自动列宽, 一般在setModel后设置才会生效. 速度较快.

  • setWordWrap(false); //取消自动换行

  • setTextElideMode(Qt::ElideNone); //超出文本不显示省略号

  • setItemDelegate(QAbstractItemDelegate *delegate) //设置委托/代理delegate, 比如使用QStyledItemDelegate实现的自定义delegate, 不设置此项的话, 默认使用QStyledItemDelegate

  • setEditTriggers(QAbstractItemView::AllEditTriggers); //禁用所有情况下的单元格编辑

  • setContextMenuPolicy(Qt::CustomContextMenu); //Item的鼠标右键设置为发送QWidget::customContextMenuRequested()信号

  • horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); //表头的鼠标右键设置为发送QWidget::customContextMenuRequested()信号

  • //setSelectionMode(QAbstractItemView::ContiguousSelection);//拖动或按shift或ctrl可以选中多行  
    setSelectionMode(QAbstractItemView::ExtendedSelection); //拖动或按shift能选中多行, 按ctrl可以切换单条item是否选中
    
  • QItemSelectionModel* selections = selectionModel();//获取当前model选择的部分

    QModelIndexList selected = selections->selectedIndexes();//获取当前选择了多少item

    QModelIndexList selected = selections->selectedRows(0);//返回当前选择了多少行

  • setHorizontalHeader(new MyHorizontalHeaderView(Qt::Horizontal, this)); //表头设置为自定义表头, MyHorizontalHeaderView继承自QHeaderView

  • horizontalHeader()->setSectionResizeMode(0,QHeaderView::Fixed); //设置第一列不能改变列宽

    • QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
    • QHeaderView::Fixed :2 用户不可更改列宽
    • QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
    • QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽

自定义QTableView的一些功能实现代码

我们常常需要给QTableView加上, 表头点击排序, 表头右键菜单, Item项右键菜单等功能:

QStyledItemDelegate

常用接口和信号

  • createEditor 创建一个QWidget(名为editor)用于编辑数据, 返回QWidget*
  • setEditorData 是将model中当前有的数据加载到上面创建的QWidget(editor)上, 自己实现从model中取数据, 和(setValue)放到editor上
  • updateEditorGeometry 设置editor显示到一定位置, 并设定其大小, 使这个editor看起来像是单元格的一部分一样, 用到option.rect
  • setModelData 将editor上的数据保存到model中
  • closeEditor 信号: 表示用户已完成对数据的编辑,可以销毁editor了
  • commitData() 信号: 必须在完成编辑数据之后, 发送该信号, 将会把新数据写回model
  • paint() 和 sizeHint() 如果需要特殊风格绘制单元项中内容, 需要重载这两个函数.

QItemSelectionModel

QHeaderView

常用接口

  • setSectionsClickable(true); //设置表头响应单击
  • setHighlightSections(true); //设置表头有高亮效果

实现自定义绘制部分表头内容

void paintSection(QPainter * painter, const QRect & rect, int logicalIndex ) const
    {
        if (logicalIndex != 0)
            QHeaderView::paintSection(painter, rect, logicalIndex);    //这里只绘制第一列, 故其余列采用系统绘制.
        else
        {
//            qDebug() << "#HorizontalHeaderView# paintSection() " << rect;
            QStyleOptionViewItem opt;    //定义一个小部件对象
            opt.initFrom(this);
            opt.rect = rect;
            if (m_isCheckAll)
                opt.state |= QStyle::State_On;
            else
                opt.state |= QStyle::State_Off;

            style()->drawPrimitive(QStyle::PE_IndicatorCheckBox, &opt, painter);
        }
    }

标签:QHeaderView,Qt,示例,单元格,表头,设置,model,Model
From: https://www.cnblogs.com/linkyip/p/18166747

相关文章

  • Qt控件QSplitter的用法
    简介继承自QFrame构造创建竖排分割窗口(一列多行)QSplitter*splitterVertical=newQSplitter(Qt::Vertical,nullptr);创建横排分割窗口(一行多列)QSplitter*splitterHorizontal=newQSplitter(Qt::Horizontal,nullptr);添加部件以子控件的方式添加QTex......
  • VIT模型压缩综述(Comprehensive Survey of Model Compression and Speed up for Vision
    摘要:  VIT是计算机视觉的开山之作,在不同的领域都表现了优越的性能.但是过大的计算量和内存需求,限制了其使用.该篇综述研究了并评估了四种模型压缩的方法,在VIT上的作用:量化,低秩分解,知识蒸馏,剪枝.系统的分析并比较了这些方法在资源受限的环境下,优化VIT方面的效果.我们......
  • 有趣的大模型之我见 | Llama AI Model
    Llama开源吗?我在写《有趣的大模型之我见|Mistral7B和Mixtral8x7B》时曾犹豫,在开源这个事儿上,到底哪个大模型算鼻祖?2023年7月18日,Meta推出了最受欢迎的大型语言模型(LLM)的第二个版本-Llama2,并主张可免费用于研究和商业用途。Llama2模型附带许可证,允许社区使用、......
  • [Python急救站]基于Transformer Models模型完成GPT2的学生AIGC学习训练模型
    为了AIGC的学习,我做了一个基于TransformerModels模型完成GPT2的学生AIGC学习训练模型,指在训练模型中学习编程AI。在编程之前需要准备一些文件:首先,先win+R打开运行框,输入:PowerShell后输入:pipinstall-Uhuggingface_hub下载完成后,指定我们的环境变量:$env:HF_ENDPOINT="ht......
  • WPF pass event method to viewmodel via Interaction:CallMethodAction,TargetObject
    <Windowx:Class="WpfApp71.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.......
  • 开发示例、C++身份证二要素实名认证接口
    在这个数据如潮的时代,我们渴望每一次点击都安心无忧。翔云身份证二要素认证,通过核验身份证号与姓名信息是否匹配的方式为您个人信息的安全加把锁,如同守护家门的钥匙,给予您最坚实的依靠。翔云二要素实名认证接口,实时联网核验身份证信息的真伪,核验返回一致或者不一致的结果......
  • Qt QSettings读写ini时 General 读不出来值
    简述我有一个配置文件,其中一个组General,怎么都读不出正确的值,全是空,但是别的组能读出来,改General2试试,果然可以,就怀疑是不是组名称被内置了。打开QSettings的帮助文档,搜索General,有内容,看下解释TheINIfileformathassevererestrictionsonthesyntaxofakey.Qt......
  • rust模块管理示例1
    1、创建如下rust工程不用管其中代码的作用是什么,只要知道有一个main.rs和四个模块s1、s2、s3、s4即可。2、s1模块使用了Rust2015的模块格式,即:需要创建s1文件夹,在s1下创建功能文件hello.rs及名为mod.rs的模块定义文件。s1/hello.rspubfnsay_hello(){println!("hellofr......
  • 交易策略-网格策略(三):示例操作一
    作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢!1、网格点为5%的交易示例以上示例是当指数在正常和低估值之间波动运用的网格交易策略。但市场不可能每次都是在低估和正常估值之间来回波动,大熊市的时候指数更多的是在低估区域反复震荡,这时候......
  • v-model
    v-model即可以作用于表单元素,又可作用于自定义组件,无论是哪一种情况,它都是一个语法糖,最终会生成一个属性和一个事件当其作用于表单元素时,vue会根据作用的表单元素类型而生成合适的属性和事件。例如,作用于普通文本框的时候,它会生成value属性和input事件,而当其作用于单选框或多选框......