Qt应用开发(基础篇)——视图基类 QAbstractItemView

一、前言

        QAbstractItemView类继承于QWidget,为全部视图类提供了基本的功能。

        QAbstractItemView类是一个抽象类,不能被实例化使用,它是QtWidget框架中树视图QTreeView、列表视图QListView、表格视图QTableView、单列视图QColumnView和标题头QHeaderView这些视图框架的虚拟父类。 

        QAbstractItemView类提供了对键盘和鼠标导航视口滚动项目编辑选择的标准支持。

键盘导航--按键描述
上/下/左/右箭头键改变当前的项并选中它
Ctrl+箭头键改变当前的项但是不选中它
Shift+箭头键改变当前的项并选中它,之前选中的项不会被取消选中
Ctrl+Space切换当前项的选择
Tab将当前项切换为下一个项。
Backspace将当前项切换为上一个项。
Home在模型中选中第一个项
End在模型中选中最后一个项
Page up根据视图中可见的行数向上滚动显示的行。
Page down根据视图中可见的行数向下滚动显示的行。
Ctrl+A选中全部的项

        QAbstractItemView类是一种MV(Model-View)的设计模式框架中的一员,Model模型是应用程序对象,View视图是它的屏幕表示,使用此设计将解耦以增加灵活性重用性。并且他们自身分别有独立的信号来通知彼此,Model模型通知View视图有关数据源保存的数据的更改,View视图提供有关用户与所显示项目交互的信息。

        更多详细的信息在help中搜索“Model/View Programming”。

      Model模型都是继承于父类QAbstractItemModel,QAbstractItemView提供setModel()方法用来设置当前的Model模型,下面是一个view+model的一个示例代码,使用子类QTableView。

//绑定view和model
QStandardItemModel *model = new QStandardItemModel();
ui->tableView->setModel(model);//view设置标题栏
m_tableModel->setHorizontalHeaderLabels(QString()<<"序列"<<"班级"<<"名称");
//view设置标题栏缩放策略
ui->tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);//view设置视图样式
ui->tableView->setColumnWidth(0,40);//设置第一列宽度
ui->tableView->setColumnWidth(1,40);//设置第二列宽度//model插入数据
int newRow = model->rowCount();//获取当前行数
model->insertRow(newRow, QModelIndex());//插入一行
model->setData(m_tableModel->index(newRow, 0),newRow);//插入数据
model->setData(m_tableModel->index(newRow, 1),“一班”);//插入数据
model->setData(m_tableModel->index(newRow, 2),"小明");//插入数据

      继承QAbstractItemView的视图类只需要实现它们自己特定于视图的功能,比如绘制项目、返回项目的几何形状、查找项目等。

二、QAbstractItemView

属性

1)alternatingRowColors

        该属性表示是否用交替色绘制项目,默认为false。

        如果设置为true,那么将会使用QPalette::Base和QPalette::AlternateBase颜色绘制,否则的话默认为QPalette::Base作为背景颜色。

bool alternatingRowColors() const
void setAlternatingRowColors(bool enable)

  

2)autoScroll

        该属性表示是否拖拽自动滚动视图的内容,默认为true。

        如果用户在viewport边缘的autoScrollMargin(默认16像素)范围内拖动,将会自动滚动视图的内容,如果当前项发生变化,则视图将自动滚动以确保当前项完全可见。该属性仅在view接受drop时有效,通过setAcceptDrops()将此属性设置为false来关闭自动滚动。

bool hasAutoScroll() const
void setAutoScroll(bool enable)
3)autoScrollMargin

        该属性表示触发自动滚动时的区域大小,默认值是16像素。

int autoScrollMargin() const
void setAutoScrollMargin(int margin)
4)defaultDropAction

        该属性表示拖放的触发动作策略,默认为没有设置任何策略。

Qt::DropAction defaultDropAction() const
void setDefaultDropAction(Qt::DropAction dropAction)
DropAction描述
Qt::CopyAction数据从源复制到目标
Qt::MoveAction数据从源移动目标
Qt::LinkAction创建一个链接从源到目标
Qt::IgnoreAction没有多余的行为要发生
5)dragDropMode

        该属性表示拖放事件的模式。

QAbstractItemView::DragDropMode dragDropMode() const
void setDragDropMode(QAbstractItemView::DragDropMode behavior)
DragDropMode描述
NoDragDrop不支持拖放事件
DragOnly视图支持拖动自己的项
DropOnly视图支持放置
DragDrop视图同时支持拖放事件
InternalMove视图只接受来自自身的移动(不接受复制)操作。
6)dragDropOverwriteMode

        该属性表示拖放事件的数据覆盖行为使能,默认为false,QTableView默认为true。

        值为true,则所选数据将在放置的时候覆盖现有项目数据,当数据被移动时,项目也被删除。

        值为false,则所选数据将在放置的时候将作为新项插入,当数据被移动时,项目也被删除。

bool dragDropOverwriteMode() const
void setDragDropOverwriteMode(bool overwrite)
7)dragEnabled

        该属性表示是否支持拖动其自己的项。

bool dragEnabled() const
void setDragEnabled(bool enable)
8)showDropIndicator

        该属性表示显示拖放项时是否显示拖放指示器。

bool showDropIndicator() const
void setDropIndicatorShown(bool enable)
 9)editTriggers

        该属性项目编辑策略。

QAbstractItemView::EditTriggers editTriggers() const
void setEditTriggers(QAbstractItemView::EditTriggers triggers)
EditTriggers描述
NoEditTriggers不允许编辑
CurrentChanged每当项目更新的时候开始编辑
DoubleClicked当项目被双击的时候开始编辑
SelectedClicked当单击已选中的项目时开始编辑
EditKeyPressed当平台编辑键被按在一个项目上时开始编辑
AnyKeyPressed当在一个项目上按下任何键时开始编辑
AllEditTriggers上述所有操作都可以触发编辑
10)horizontalScrollMode

        该属性表示水平方向视图如何滚动其内容,ScrollPerItem根据项滚动,ScrollPerPixel根据像素滚动。

QAbstractItemView::ScrollMode horizontalScrollMode() const
void setHorizontalScrollMode(QAbstractItemView::ScrollMode mode)
void resetHorizontalScrollMode()
11)verticalScrollMode

        该属性表示垂直方向视图如何滚动其内容,ScrollPerItem根据项滚动,ScrollPerPixel根据像素滚动。

QAbstractItemView::ScrollMode verticalScrollMode() const
void setVerticalScrollMode(QAbstractItemView::ScrollMode mode)
void resetVerticalScrollMode()
12)iconSize

        该属性表示项目的图标的尺寸。

QSize iconSize() const
void setIconSize(const QSize &size)
13)selectionBehavior

        该属性表示视图的选择行为。

QAbstractItemView::SelectionBehavior selectionBehavior() const
void setSelectionBehavior(QAbstractItemView::SelectionBehavior behavior)
SelectionBehavior描述
SelectItems选择单项
SelectRows选择一行
SelectColumns选择一列
14)selectionMode

        该属性表示视图的选择模式。

QAbstractItemView::SelectionMode selectionMode() const
void setSelectionMode(QAbstractItemView::SelectionMode mode)
SelectionMode描述
SingleSelection只能单选,当用户选择一个项目时,任何已经选择的项目都变为未选择,用户可以在单击所选项时按Ctrl键取消所选项。
ContiguousSelection当用户以通常的方式(比如鼠标左键)选择一个项目时,选中的项目将被清除,新项目将被选中。但是,如果用户在单击项时按Shift键,则当前项和所单击项之间的所有项都将被选中或未选中,具体取决于所单击项的状态。
ExtendedSelection当用户以通常的方式(比如鼠标左键)选择一个项目时,选中的项目将被清除,新项目将被选中。但是,如果用户在单击项时按下Ctrl键,则被单击的项被切换,而所有其他项保持不变。如果用户在单击项时按Shift键,则当前项和所单击项之间的所有项都被选中或未选中,具体取决于所单击项的状态。可以通过将鼠标拖动到多个项目上来选择它们。
MultiSelection当用户以通常的方式选择一个项目时,该项目的选择状态被切换,而其他项目保持不变。可以通过将鼠标拖动到多个项目上来切换它们。
NoSelection项目不能被选中
15)tabKeyNavigation

        该属性表示是否启用带有制表符和后退制表符的项导航。

bool tabKeyNavigation() const
void setTabKeyNavigation(bool enable)
16)textElideMode

        该属性表示省略文本中“…”的位置,默认值为Qt::ElideRight。

Qt::TextElideMode textElideMode() const
void setTextElideMode(Qt::TextElideMode mode)

公共方法

1)currentIndex

        返回当前的项目的信息,保存在QModelIndex(项目的行、列、数据、标识、是否有效等信息)。

QModelIndex currentIndex() const
2)setCurrentIndex

        设置当前的项目,并且选中它,如果当前选择模式是NoSelection则该方法无效。

void setCurrentIndex(const QModelIndex &index)

        如果需要设置某一项为当前项但是又不要选中它,可以这么使用。

selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
3)selectionModel

        返回当前选中项目的模型,保存在QItemSelectionModel

QItemSelectionModel *selectionModel() const

          如果需要设置某一项为当前项但是又不要选中它,可以这么使用。

selectionModel()->setCurrentIndex(index, QItemSelectionModel::NoUpdate);
4)setSelectionModel

        将当前选择模型设置为给定的selectionModel,如果使用了setModel()设置模型,模型将会被替换。

void setSelectionModel(QItemSelectionModel *selectionModel)
5)clearSelection

        清除选中的项目,currentIndex不会被改变。

void clearSelection()
6)model

        返回设置的模型。

QAbstractItemModel *model() const
7)setModel

        设置视图模型,替换之前的默认模型。

void setModel(QAbstractItemModel *model)

        旧的模型如果不用的话,需要删除它,模型的使用参考开头示例。

QItemSelectionModel *m = view->selectionModel();
view->setModel(new model);
delete m;
8)closePersistentEditor

        关闭给定索引处项的持久编辑器。

void closePersistentEditor(const QModelIndex &index)
9)indexAt

        返回给定坐标出的索引。

virtual QModelIndex indexAt(const QPoint &point) const = 0
10)visualRect

        返回给定索引处的矩形坐标。

virtual QRect visualRect(const QModelIndex &index) const = 0
11)indexWidget

        返回给定索引处的widget部件。

QWidget *indexWidget(const QModelIndex &index) const
12)setIndexWidget

        设置给定索引处的widget部件。

void setIndexWidget(const QModelIndex &index, QWidget *widget)

         比如我们可能需要视图某个位置是一个编辑框或者是一个下拉框。

setIndexWidget(index, new QLineEdit);
13)itemDelegate

        根据索引、行、列返回项目委托

QAbstractItemDelegate *itemDelegate() const
QAbstractItemDelegate *itemDelegate(const QModelIndex &index) const
QAbstractItemDelegate *itemDelegateForColumn(int column) const
QAbstractItemDelegate *itemDelegateForRow(int row) const
14)setItemDelegate

        设置委托,可以在某行、某列或者全部视图。

void setItemDelegate(QAbstractItemDelegate *delegate)
void setItemDelegateForColumn(int column, QAbstractItemDelegate *delegate)
void setItemDelegateForRow(int row, QAbstractItemDelegate *delegate)

        下面示例演示如何使用委托。

        实例化委托继承于QStyledItemDelegate。

void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const
{if (index.column() == 1) {int progress = index.data().toInt();QStyleOptionProgressBar progressBarOption;progressBarOption.rect = option.rect;progressBarOption.minimum = 0;progressBarOption.maximum = 100;progressBarOption.progress = progress;progressBarOption.text = QString::number(progress) + "%";progressBarOption.textVisible = true;QApplication::style()->drawControl(QStyle::CE_ProgressBar,&progressBarOption, painter);} elseQStyledItemDelegate::paint(painter, option, index);
}

         设置委托。

ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改
ui->tableWidget->setColumnCount(2);//只设置列数
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<tr("Log")<<tr("progress"));
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置action菜单模式
ui->tableWidget->verticalHeader()->setCascadingSectionResizes(false);
ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
ui->tableWidget->verticalHeader()->setMaximumSectionSize(30);
ui->tableWidget->verticalHeader()->setMinimumSectionSize(30);
ui->tableWidget->verticalHeader()->setMaximumWidth(20);
ui->tableWidget->verticalHeader()->setMinimumWidth(20);
ui->tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
ui->tableWidget->horizontalHeader()->setMaximumHeight(31);
ui->tableWidget->horizontalHeader()->setMinimumHeight(31);
ui->tableWidget->verticalHeader()->setDefaultAlignment(Qt::AlignCenter);
ui->tableWidget->setItemDelegate(new WidgetDelegate());addstr("cook dev",100);
addstr("cook dev",50);
addstr("cook dev",25);
void MainWindow::addstr(QString str,int progress)
{ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);//禁止修改int RowCont = ui->tableWidget->rowCount();ui->tableWidget->setItem(RowCont,0,new QTableWidgetItem(str));ui->tableWidget->setItem(RowCont,1,new QTableWidgetItem(QString::number(progress)));ui->tableWidget->item(RowCont,0)->setTextAlignment(Qt::AlignLeft|Qt::AlignVCenter);ui->tableWidget->scrollToBottom();
}

15)clearSelection

        取消全部项目被选中的状态,但是当前项currentIndex不会改变。

void clearSelection()
16)edit

        开始对索引下的项目编辑。

void edit(const QModelIndex &index)
17)reset

        重置视图的状态,包括打开的编辑器,滚动条位置,选择等。现有的更改将不会提交。如果您想在重置视图时保存更改,您可以重新实现此函数,提交更改,然后调用父类的实现。

virtual void reset()
18)scrollToBottom

        滚动到底部。

void scrollToBottom()
19)scrollToTop

        滚动条到顶部。

void scrollToTop()
20)selectAll

        选择全部。

virtual void selectAll()
21)rootIndex

      返回根索引。

QModelIndex rootIndex() const
22)setRootIndex

      设置根索引。

void setRootIndex(const QModelIndex &index)
23)update

      刷新某索引下的项目

void update(const QModelIndex &index)

信号

1)activated

        当索引index指定的项目被用户激活时,就会发出这个信号。如何激活项目取决于平台;例如,单点或双击项目,或在项目处于当前状态时按回车键。

void activated(const QModelIndex &index)
2)clicked

        当左键单击鼠标按钮时发出该信号。鼠标所单击的项由index指定。该信号仅在索引有效时发出。

void clicked(const QModelIndex &index)
3)doubleClicked

        该信号在双击鼠标按钮时发出。鼠标双击的项由index指定。该信号仅在索引有效时发出。

void doubleClicked(const QModelIndex &index)
4)doubleClicked

        当鼠标光标进入index指定的项时发出此信号。鼠标跟踪需要启用此功能才能工作。

void entered(const QModelIndex &index)
5)iconSizeChanged

        使用setIconSize改变图标尺寸的时候触发该信号。

void iconSizeChanged(const QSize &size)
6)pressed

        这个信号在按下鼠标按钮时发出。按下鼠标的项由index指定。该信号仅在索引有效时发出。

void pressed(const QModelIndex &index)
7)viewportEntered

        当鼠标光标进入视口viewport时发出此信号,需要启用鼠标跟踪,此信号才会触发。

void viewportEntered()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/145894.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 反向代理 负载均衡 动静分离

一样东西的诞生通常都是为了解决某些问题&#xff0c;对于 Nginx 而言&#xff0c;也是如此。 比如&#xff0c;你出于无聊写了一个小网站&#xff0c;部署到 tomcat 之后可以正常访问 但是后来&#xff0c;你的这个小网站因为内容很诱人逐步的火了&#xff0c;用户越来越多&a…

深度学习笔记_1、定义神经网络

1、使用了PyTorch的nn.Module类来定义神经网络模型;使用nn.Linear来创建全连接层。(CPU) import torch.nn as nn import torch.nn.functional as F from torchsummary import summary# 定义神经网络模型 class Net(nn.Module):def __init__(self):super(Net, self).__init__()…

赋能工业数字化转型|辽宁七彩赛通受邀出席辽宁省工业互联网+安全可控先进制造业数字服务产业峰会

2023年9月25日下午&#xff0c;由软通动力信息技术&#xff08;集团&#xff09;股份有限公司主办的“工业互联网安全可控先进制造业数字服务产业峰会”在辽宁沈阳顺利举办。省市区各级政府、科研院所领导、技术专家、企业高管以及生态合作伙伴代表等齐聚一堂&#xff0c;共同探…

【JVM】第五篇 垃圾收集器G1和ZGC详解

导航 一. G1垃圾收集算法详解1. 大对象Humongous说明2. G1收集器执行一次GC运行的过程步骤3. G1垃圾收集分类4. G1垃圾收集器参数设置5. G1垃圾收集器的优化建议6. 适合使用G1垃圾收集器的场景?二. ZGC垃圾收集器详解1. NUMA与UMA2. 颜色指针3. ZGC的运作过程4. ZGC垃圾收集器…

【ShaderLab罪恶装备卡通角色_二次元风格_“Sol Badguy“_角色渲染(第二篇)】

罪恶装备背德之炎卡通角色_二次元风格_Unity 角色渲染 角色初始效果&#xff1a;基础渲染SimpleBas 资源分析模型顶点颜色&#xff1a; 贴图资源SOL_base_基础色块效果&#xff1a;其中SOL_base_A通道的效果&#xff1a; SOL_ilm&#xff1a;如下SOL_ilm模型上区域分布- 左到右…

python-切换镜像源和使用PyCharm进行第三方开源包安装

文章目录 前言python-切换镜像源和使用PyCharm进行第三方开源包安装1. 切换镜像源2. 使用PyCharm进行第三方开源包安装 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每…

python爬取百度图片

1.查询数据 打开网页。 https://cn.bing.com/images/search?q%E7%99%BE%E5%BA%A6%E5%9B%BE%E7%89%87&formHDRSC2&first1&cw1585&ch924 我们右键查看网页源代码,发现能找到我们需要的img衔接,但是这是一个动态网页。我们每次向下滑动网页&#xff0c;会发现图…

RHEL8.0安装+基础命令练习+discuz(lamp)论坛搭建

上课练习环境&#xff1a; RHEL8.0系统镜像下载&#xff1a; 链接1&#xff1a;https://pan.baidu.com/s/1wX2j-aTO1VRcHQYpCDYnEg 提取码&#xff1a;6buv 链接2&#xff1a;https://ws28.cn/f/32i4oq8p5r1 &#xff08;下载完2个文件后只需要解压001&#xff0c;推荐压缩…

Ubuntu服务器安全性提升:修改SSH默认端口号

在Ubuntu服务器上&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种至关重要的远程连接工具。它提供了一种安全的方式来远程连接和管理计算机系统&#xff0c;通过加密通信来确保数据的保密性和完整性。SSH协议广泛用于计算机网络中&#xff0c;用于远程管理、文件传…

打包python模块代码到pypi

python中&#xff0c;我们会在自己业务中&#xff0c;重复性的使用某些功能。我们可以把这些公用的模块&#xff0c;打包上传&#xff0c;然后给需要的人使用&#xff0c;pypi给我们提供了这个机会 本期目录 一、准备工作 二、编写文件 三、上传下载 一、准备工作 1、需要git…

妙不可言的Python之旅----(一)

初识Python python的起源 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多 范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python雏形&#xff09; 1991年&#xff0c;第一个Python解释器诞生 Python这个名字&#xff…

ubuntu 18.04 LTS安装opencv 3.4.16 + opencv_contrib 3.4.16

1.下载 opencv 3.4.16 opencv_contrib 3.4.16 其中&#xff0c;opencv_contrib解压后的多个文件夹复制到opencv内、合并 2.安装 参考博文&#xff1a; https://zhuanlan.zhihu.com/p/650792342 https://zhuanlan.zhihu.com/p/87197806 其中 &#xff08;1&#xff09;cmake前…

Redis与分布式-哨兵模式

接上文 Redis与分布式-主从复制 1.哨兵模式 启动一个哨兵&#xff0c;只需要修改配置文件即可&#xff0c; sentinel monitor lbwnb 1247.0.0.1 6001 1先将所有服务关闭&#xff0c;然后修改配置文件&#xff0c;redis Master&#xff0c;redis Slave&#xff0c;redis Slave…

基于大语言模型扬长避短架构服务

秘诀&#xff1a; 扬泛化之长&#xff0c; 避时延之短

最新AI智能创作系统ChatGPT商业源码+详细图文搭建部署教程+AI绘画系统

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

Python学习之索引与切片

Python学习之索引与切片 s “0abcdefghijklmnopqrstuvwxyz”&#xff0c;第一个元素‘0’&#xff0c;索引号为0&#xff0c;最后一个元素‘z’&#xff0c;索引号为26 1. s[0]获取索引号为0的元素 2. s[1:3]获取索引号为1的元素&#xff0c;直到但不包括索引号为3的元素。即…

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例

西门子S7-1200使用LRCF通信库与安川机器人进行EthernetIP通信的具体方法示例 准备条件: PLC:S7-1200 1214C DC/DC/DC 系统版本4.5及以上。 机器人控制柜:安川YRC1000。 软件:TIA V17 PLC做主站,机器人做从站。 具体方法可参考以下内容: 使用的库文件为西门子 1200系列…

源码编译安装systemtap

目录 编译环境 编译步骤 编译环境 阿里云ubuntu20.04 编译步骤 1 先安装elfutils&#xff0c;参见我的前一篇博客 源码编译elfutils_金色熊族的博客-CSDN博客 2 下载systemtap源码 3 解压 解压后的文件夹与elfutils的文件夹应该是平行的&#xff0c;如下图&#xff1a…

网页一直跳转到国家反诈中心页面

很明显&#xff0c;我进入的是vscode的官方下载地址。 但是一直会出现反诈中心的拦截 我们需要在控制面板中&#xff0c;找到网络&#xff0c; 将Internet 协议版本 4 (TCP/IPv4)的属性改成 使用下面的DNS 服务地址(E)&#xff1a;8.8.8.8 这样就可以正常访问相关的页面了

ElementPlus

1.国际化--中文 import ElementPlus from element-plus import zhCn from element-plus/dist/locale/zh-cn.mjsapp.use(ElementPlus, {locale: zhCn, }) 2.排序