百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Qt模型视图框架:QStyledItemDelegate、QTreeWidget、QTreeView

ccwgpt 2025-04-10 21:07 64 浏览 0 评论

QStyledItemDelegate

一、描述

当在 Qt 项目视图中显示来自模型的数据时,单个项目由委托绘制。此外,当一个项目被编辑时,它提供了一个编辑器小部件,小部件在编辑时放置在项目视图的顶部。 QStyledItemDelegate 是所有 Qt 项目视图的默认委托,并在创建它们时安装在它们上。

模型中项目的数据被分配了一个 ItemDataRole。项目可以为每个角色存储一个 QVariant。 QStyledItemDelegate 实现了用户期望的最常见数据类型的显示和编辑,包括布尔值、整数和字符串。

数据将根据它们在模型中的角色而不同地绘制。下面是委托可以为每个角色处理的角色和数据类型:

  • Qt::BackgroundRole:QBrush
  • Qt::CheckStateRole:Qt::CheckState
  • Qt::DecorationRole:QIcon、QPixmap、QImage、QColor
  • Qt::DisplayRole:QString 和带有字符串表示的类型
  • Qt::EditRole:详见 QItemEditorFactory
  • Qt::FontRole:QFont
  • Qt::SizeHintRole:QSize
  • Qt::TextAlignmentRole:Qt::Alignment
  • Qt::ForegroundRole:QBrush

子类化 QStyledItemDelegate

如果委托不支持绘制所需的数据类型,或者想自定义项目的绘制,则需要子类化 QStyledItemDelegate,并重新实现paint() 和sizeHint()。为每个项目单独调用paint() 函数,使用sizeHint(),可以为每个项目指定提示。

自定义委托可以在不使用编辑器项目工厂的情况下提供编辑器。在这种情况下,必须重新实现以下虚函数:

  • createEditor():返回用于更改模型数据的小部件,并且可以重新实现以自定义编辑行为。
  • setEditorData():为小部件提供要操作的数据。
  • updateEditorGeometry():确保编辑器相对于项目视图正确显示。
  • setModelData():将更新的数据返回给模型。
  • QStyledItemDelegate 与 QItemDelegate

这两个类的区别在于 QStyledItemDelegate 实现了paint()函数。除非需要自定义项目显示,否则建议在实现自定义委托或使用 Qt 样式表时使用 QStyledItemDelegate 作为基类。

二、成员函数

1、QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const。

返回用于编辑由 index 指定的项目以进行编辑的小部件。父小部件和样式选项用于控制编辑器小部件的显示方式。(设置qss/Style要在父小部件上设置)

2、QString displayText(const QVariant &value, const QLocale &locale)

此函数返回委托将用于在语言环境中显示模型的 Qt::DisplayRole 的字符串。 value 是模型提供的 Qt::DisplayRole 的值。

默认实现使用 QLocale::toString 将值转换为 QString。

对于空模型索引,即模型返回无效 QVariant 的索引,不会调用此函数。

3、bool eventFilter(QObject *editor, QEvent *event)

如果editor是一个有效的 QWidget 并且event被处理,则返回 true,否则返回false。

默认处理以下按键事件:

  • Tab
  • Backtab
  • Enter
  • Return
  • Esc

如果编辑器的类型是 QTextEdit 或 QPlainTextEdit,则不处理 Enter 和 Return 键。

在 Tab、Backtab、Enter、Return 键按下事件的情况下,编辑器的数据提交到模型并关闭编辑器。

  • 如果事件是按 Tab 键,则视图将在视图中的下一项上打开编辑器。
  • 如果事件是 Backtab 键,则视图将打开视图中前一项的编辑器。
  • 如果事件是 Esc 键按下事件,则编辑器将关闭而不提交其数据。

4、void initStyleOption(QStyleOptionViewItem *option, const QModelIndex &index)

使用索引索引的值初始化选项。

当子类需要 QStyleOptionViewItem,但又不想自己设置所有信息时,此方法很有用。

5、void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const。

在子类中重新实现paint()时。使用 initStyleOption() 以与 QStyledItemDelegate 相同的方式设置选项。

尽可能在绘画时使用option。特别是它的 rect 变量来决定在哪里绘制和它的状态来确定它是启用还是选择。

绘制后,应该确保绘制器返回到调用此函数时提供的状态(在绘画之前调用 QPainter::save() 和之后调用 QPainter::restore())。

6、void setEditorData(QWidget *editor, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const。

从模型索引指定的数据模型项设置编辑器要显示和编辑的数据。

默认实现将数据存储在编辑器小部件的用户属性中。

7、void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const。

从编辑器小部件获取数据并将其存储在项目索引处的指定模型中。

默认实现从编辑器小部件的用户属性获取要存储在数据模型中的值。

8、QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const。



返回委托显示由索引指定的项目所需的大小,同时考虑选项提供的样式信息。

9、void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index)

重新实现:
QAbstractItemDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const。

根据option更新由 index 指定的项目的编辑器。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」



QTreeWidget

一、描述

QTreeWidget 类是一个便利类,它提供了一个标准的树形小部件。

在最简单的形式中,可以通过以下方式构建树小部件:

QTreeWidget *treeWidget = new QTreeWidget();
treeWidget->setColumnCount(1);
QList items;
for (int i = 0; i < 10; ++i)
items.append(new QTreeWidgetItem(static_cast(nullptr), QStringList(QString("item: %1").arg(i))));
treeWidget->insertTopLevelItems(0, items);

在将项目添加到树小部件之前,必须使用 setColumnCount() 设置列数。

二、属性成员

1、columnCount : int

在树小部件中显示的列数。

2、topLevelItemCount : const int

顶级项目的数量。默认值为 0。

三、成员函数

3.1、信号

1、void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)

当前项目改变时发出这个信号。 当前项由 current 指定,这将替换上一项previous。

2、void itemActivated(QTreeWidgetItem *item, int column)

当用户通过单击或双击或按下特殊键(例如 Enter)激活项目时,会发出此信号。

column是被点击的项目的列。

3、void itemChanged(QTreeWidgetItem *item, int column)

当指定项中列的内容发生更改时,会发出此信号。

4、void itemClicked(QTreeWidgetItem *item, int column)

当用户在小部件内部单击时会发出此信号。

5、void itemCollapsed(QTreeWidgetItem *item)

当指定的项目折叠时发出此信号。

注意:调用 collapseAll() 时项目更改其状态,不会发出此信号。

6、void itemDoubleClicked(QTreeWidgetItem *item, int column)

当用户在小部件内双击时会发出此信号。column是被单击的项目的列。

7、void itemEntered(QTreeWidgetItem *item, int column)

当鼠标光标进入指定列上的项目时,会发出此信号。需要启用鼠标跟踪才能使用此功能。

8、void itemExpanded(QTreeWidgetItem *item)

当指定的项目被展开以显示其所有子项时,会发出此信号。

注意:调用 expandAll() 时项目更改其状态,不会发出此信号。

9、void itemPressed(QTreeWidgetItem *item, int column)

当用户在小部件内按下鼠标按钮时会发出此信号。column是被点击的项目的列。

10、void itemSelectionChanged()

当树小部件中的选择发生变化时,会发出此信号。

3.2、函数

1、void clear()

通过删除其所有项目和选择来清除树小部件。

2、void collapseItem(const QTreeWidgetItem *item)

关闭项目。这会导致包含项目子项的树被折叠。

3、void expandItem(const QTreeWidgetItem *item)

展开项目。 这会导致包含项目子项的树被展开。

4、void scrollToItem(const QTreeWidgetItem *item,
QAbstractItemView::ScrollHint hint = EnsureVisible)

确保该项目可见,必要时使用指定的 hint 滚动视图。

5、void addTopLevelItem(QTreeWidgetItem *item)

void addTopLevelItems(const QList &items)

将项目作为小部件中的顶级项目追加。

6、QList findItems(const QString &text, Qt::MatchFlags flags, int column = 0)

在给定的列中使用给定的标志返回与给定文本匹配的项目列表。

7、QModelIndex indexFromItem(const QTreeWidgetItem *item, int column = 0)

返回与给定列中的给定项关联的 QModelIndex。

8、QTreeWidgetItem * itemFromIndex(const QModelIndex &index)

返回指向与给定索引关联的 QTreeWidgetItem 的指针。

9、int indexOfTopLevelItem(QTreeWidgetItem *item)

返回给定顶级项目的索引,如果找不到该项目,则返回 -1。

10、void insertTopLevelItem(int index, QTreeWidgetItem *item)

void insertTopLevelItems(int index, const QList &items)

在视图的顶级索引处插入项目。如果该项目已插入其他地方,则不会插入。

11、QTreeWidgetItem * invisibleRootItem()

返回树小部件的不可见根项目。

不可见的根项通过QTreeWidgetItem API 提供了对树widget 的顶级项的访问,使得可以编写统一处理顶级项及其子项的功能(例如递归处理)。

12、QTreeWidgetItem * itemAt(const QPoint &p)

返回指向坐标 p 处的项目的指针。坐标相对于树小部件的 viewport()。

13、QWidget * itemWidget(QTreeWidgetItem *item, int column)

void setItemWidget(QTreeWidgetItem *item, int column, QWidget *widget)
void removeItemWidget(QTreeWidgetItem *item, int column)

item中的小部件。小部件的 autoFillBackground 属性必须设置为 true,否则小部件的背景将是透明的,同时显示模型数据和树小部件项目。

此功能仅应用于在树小部件项目的位置显示静态内容。 如果要显示自定义动态内容或实现自定义编辑器小部件,请改用 QTreeView 和子类 QStyledItemDelegate。

注意:QTreeWidge拥有小部件的所有权。

14、void sortItems(int column, Qt::SortOrder order)

按给定列中的值按指定顺序对小部件中的项目进行排序。

15、QTreeWidgetItem * takeTopLevelItem(int index)

删除给定索引处的顶级项目并返回它。

16、QTreeWidgetItem * topLevelItem(int index)

返回给定索引处的顶级项目。

QTreeView

一、描述

QTreeView 实现了模型中项目的树表示。

构建一个树视图显示模型中的数据很简单。 在以下示例中,目录的内容由 QFileSystemModel 提供并显示为树:

QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
QTreeView *tree = new QTreeView(splitter);
tree->setModel(model);

模型/视图架构确保树视图的内容随着模型的变化而更新。具有子项的项目可以处于展开(子项可见)或折叠(子项隐藏)状态。

键绑定

  • QTreeView 支持一组键绑定,使用户能够在视图中导航并与项目的内容进行交互:
  • Up:将光标移动到上一行同一列中的项目。如果当前项的父项没有更多行可导航到,则光标将移动到父项之前的同级项的最后一行中的相关项。
  • Down:移动光标到下一行同一列中的项目。如果当前项的父项没有更多行可导航到,则光标移动到父项之后的同级项的第一行中的相关项。
  • Left:通过折叠分支隐藏当前项目(如果存在)的子项。
  • Minus:与Left相同。
  • Right:通过扩展分支显示当前项(如果存在)的子项。
  • Plus:与 Right 相同。
  • Asterisk(星号):展开当前项目及其所有子项(如果存在)。
  • PageUp:将光标向上移动一页。
  • PageDown:将光标向下移动一页。
  • Home:将光标移动到模型中第一个顶级项目的第一行的同一列中的项目。
  • End:将光标移动到模型中最后一个顶级项目的最后一行的同一列中的项目。

F2:在可编辑模型中,这将打开当前项目进行编辑。Escape 键可用于取消编辑过程并恢复对显示数据的任何更改。

提高性能

可以向视图提供有关它正在处理的数据的提示,以便在显示大量项目时提高其性能。对于旨在显示具有相同高度的项目的视图,可以采用的一种方法是将 uniformRowHeights 属性设置为 true。

二、属性成员

1、allColumnsShowFocus : bool

项目是否应使用所有列显示键盘焦点。默认值为false。

如果此属性为 true,则所有列都将显示焦点,否则只有一列将显示焦点。

2、animated : bool

是否启用动画。默认为 false。如果为true,则树视图将为分支的扩展和折叠设置动画。

3、autoExpandDelay : int

在拖放操作期间打开树中的项目之前的延迟时间(毫秒)。默认为 -1,表示禁用延迟。

4、expandsOnDoubleClick : bool

是否可以通过双击展开。默认为true。

5、headerHidden : bool

是否显示标题。默认为false。

6、indentation : int

树视图中项目的缩进。对于顶级项目,缩进指定了从视口边缘到第一列项目的水平距离。对于子项,它指定其父项的缩进。

默认情况下,此属性的值取决于样式。因此,当样式更改时,此属性会随之更新。调用 setIndentation() 停止更新,调用 resetIndentation() 将恢复默认行为。

7、itemsExpandable : bool

项目是否可由用户展开。默认为 true。

8、rootIsDecorated : bool

是否显示用于展开和折叠顶级项目的控件。默认情况下,此属性为 true。

带有子项的项目通常显示有用于展开和折叠它们的控件,从而允许显示或隐藏其子项。如果此属性为 false,可用于使单级树结构看起来像一个简单的项目列表。

9、sortingEnabled : bool

此属性保存是否启用排序。默认值为false。

注意:为了避免性能问题,建议在将项目插入树后启用排序。也可以在将项目插入树之前将项目插入到列表中。

10、uniformRowHeights : bool

树视图中的所有项目是否具有相同的高度。

高度是从视图中的第一项获得的。当该项的数据发生变化时,它会更新。

11、wordWrap : bool

项目文本自动换行策略。如果为true,则项目文本会在必要的断字处换。默认为 false。

三、成员函数

1、void collapse(const QModelIndex &index)

折叠索引指定的模型项。

2、void collapseAll()

折叠所有展开的项目。

3、[signal] void collapsed(const QModelIndex &index)

当索引指定的项目折叠时发出此信号。

4、void expand(const QModelIndex &index)

展开索引指定的模型项。

5、void expandAll()

展开所有可展开的项目。如果模型包含大量项目,此功能将需要一些时间来执行。

6、void expandRecursively(const QModelIndex &index, int depth = -1)

将给定索引处的项目及其所有子项扩展到给定深度。深度是相对于给定索引的。 深度为 -1 将扩展所有子项,深度为 0 将仅扩展给定索引。

如果模型包含大量项目,此功能将需要一些时间来执行。

7、void expandToDepth(int depth)

将所有可扩展项目扩展到给定深度。

8、[signal] void expanded(const QModelIndex &index)

当索引指定的项目被扩展时,会发出此信号。

9、void hideColumn(int column) / void showColumn(int column)

隐藏/显示给定的列。这个函数只能在模型初始化后调用,因为视图需要知道列数才能操作。

10、void resizeColumnToContents(int column)

将列的大小调整为其内容的大小。

11、void sortByColumn(int column, Qt::SortOrder order)

按给定列中的值和顺序对模型进行排序。

【领QT开发教程学习资料,点击下方链接莬费领取↓↓,先码住不迷路~】

点击这里:「链接」


原文链接:
https://blog.csdn.net/kenfan1647/article/details/107205428

相关推荐

团队管理“布阵术”:3招让你的团队战斗力爆表!

为何古代军队能够以一当十?为何现代企业有的团队高效似“特种部队”,有的却松散若“游击队”?**答案正隐匿于“布阵术”之中!**今时今日,让我们从古代兵法里萃取3个核心要义,助您塑造一支战斗力爆棚的...

知情人士回应字节大模型团队架构调整

【知情人士回应字节大模型团队架构调整】财联社2月21日电,针对原谷歌DeepMind副总裁吴永辉加入字节跳动后引发的团队调整问题,知情人士回应称:吴永辉博士主要负责AI基础研究探索工作,偏基础研究;A...

豆包大模型团队开源RLHF框架,训练吞吐量最高提升20倍

强化学习(RL)对大模型复杂推理能力提升有关键作用,但其复杂的计算流程对训练和部署也带来了巨大挑战。近日,字节跳动豆包大模型团队与香港大学联合提出HybridFlow。这是一个灵活高效的RL/RL...

创业团队如何设计股权架构及分配(创业团队如何设计股权架构及分配方案)

创业团队的股权架构设计,决定了公司在随后发展中呈现出的股权布局。如果最初的股权架构就存在先天不足,公司就很难顺利、稳定地成长起来。因此,创业之初,对股权设计应慎之又慎,避免留下巨大隐患和风险。两个人如...

消息称吴永辉入职后引发字节大模型团队架构大调整

2月21日,有消息称前谷歌大佬吴永辉加入字节跳动,并担任大模型团队Seed基础研究负责人后,引发了字节跳动大模型团队架构大调整。多名原本向朱文佳汇报的算法和技术负责人开始转向吴永辉汇报。简单来说,就是...

31页组织效能提升模型,经营管理团队搭建框架与权责定位

分享职场干货,提升能力!为职场精英打造个人知识体系,升职加薪!31页组织效能提升模型如何拿到分享的源文件:请您关注本头条号,然后私信本头条号“文米”2个字,按照操作流程,专人负责发送源文件给您。...

异形柱结构(异形柱结构技术规程)

下列关于混凝土异形柱结构设计的说法,其中何项正确?(A)混凝土异形柱框架结构可用于所有非抗震和抗震设防地区的一般居住建筑。(B)抗震设防烈度为6度时,对标准设防类(丙类)采用异形柱结构的建筑可不进行地...

职场干货:金字塔原理(金字塔原理实战篇)

金字塔原理的适用范围:金字塔原理适用于所有需要构建清晰逻辑框架的文章。第一篇:表达的逻辑。如何利用金字塔原理构建基本的金字塔结构受众(包括读者、听众、观众或学员)最容易理解的顺序:先了解主要的、抽象的...

底部剪力法(底部剪力法的基本原理)

某四层钢筋混凝土框架结构,计算简图如图1所示。抗震设防类别为丙类,抗震设防烈度为8度(0.2g),Ⅱ类场地,设计地震分组为第一组,第一自振周期T1=0.55s。一至四层的楼层侧向刚度依次为:K1=1...

结构等效重力荷载代表值(等效重力荷载系数)

某五层钢筋混凝土框架结构办公楼,房屋高度25.45m。抗震设防烈度8度,设防类别丙类,设计基本地震加速度0.2g,设计地震分组第二组,场地类别为Ⅱ类,混凝土强度等级C30。该结构平面和竖向均规则。假定...

体系结构已成昭告后世善莫大焉(体系构架是什么意思)

实践先行也理论已初步完成框架结构留余后人后世子孙俗话说前人栽树后人乘凉在夏商周大明大清民国共和前人栽树下吾之辈已完成结构体系又俗话说青出于蓝而胜于蓝各个时期任务不同吾辈探索框架结构体系经历有限肯定发展...

框架柱抗震构造要求(框架柱抗震设计)

某现浇钢筋混凝土框架-剪力墙结构高层办公楼,抗震设防烈度为8度(0.2g),场地类别为Ⅱ类,抗震等级:框架二级,剪力墙一级,混凝土强度等级:框架柱及剪力墙C50,框架梁及楼板C35,纵向钢筋及箍筋均采...

梁的刚度、挠度控制(钢梁挠度过大会引起什么原因)

某办公楼为现浇钢筋混凝土框架结构,r0=1.0,混凝土强度等级C35,纵向钢筋采用HRB400,箍筋采用HPB300。其二层(中间楼层)的局部平面图和次梁L-1的计算简图如图1~3(Z)所示,其中,K...

死要面子!有钱做大玻璃窗,却没有钱做“柱和梁”,不怕房塌吗?

活久见,有钱做2层落地大玻璃窗,却没有钱做“柱子和圈梁”,这样的农村自建房,安全吗?最近刷到个魔幻施工现场,如下图,这栋5开间的农村自建房,居然做了2个全景落地窗仔细观察,这2个落地窗还是飘窗,为了追...

不是承重墙,物业也不让拆?话说装修就一定要拆墙才行么

最近发现好多朋友装修时总想拆墙“爆改”空间,别以为只要避开承重墙就能随便砸!我家楼上邻居去年装修,拆了阳台矮墙想扩客厅,结果物业直接上门叫停。后来才知道,这种配重墙拆了会让阳台承重失衡,整栋楼都可能变...

取消回复欢迎 发表评论: