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

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

liebian365 2024-11-05 11:49 3 浏览 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<QTreeWidgetItem *> items;
for (int i = 0; i < 10; ++i)
items.append(new QTreeWidgetItem(static_cast<QTreeWidget *>(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<QTreeWidgetItem *> &items)

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

6、QList<QTreeWidgetItem *> 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<QTreeWidgetItem *> &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

相关推荐

快递查询教程,批量查询物流,一键管理快递

作为商家,每天需要查询许许多多的快递单号,面对不同的快递公司,有没有简单一点的物流查询方法呢?小编的回答当然是有的,下面随小编一起来试试这个新技巧。需要哪些工具?安装一个快递批量查询高手快递单号怎么快...

一键自动查询所有快递的物流信息 支持圆通、韵达等多家快递

对于各位商家来说拥有一个好的快递软件,能够有效的提高自己的工作效率,在管理快递单号的时候都需要对单号进行表格整理,那怎么样能够快速的查询所有单号信息,并自动生成表格呢?1、其实方法很简单,我们不需要一...

快递查询单号查询,怎么查物流到哪了

输入单号怎么查快递到哪里去了呢?今天小编给大家分享一个新的技巧,它支持多家快递,一次能查询多个单号物流,还可对查询到的物流进行分析、筛选以及导出,下面一起来试试。需要哪些工具?安装一个快递批量查询高手...

3分钟查询物流,教你一键批量查询全部物流信息

很多朋友在问,如何在短时间内把单号的物流信息查询出来,查询完成后筛选已签收件、筛选未签收件,今天小编就分享一款物流查询神器,感兴趣的朋友接着往下看。第一步,运行【快递批量查询高手】在主界面中点击【添...

快递单号查询,一次性查询全部物流信息

现在各种快递的查询方式,各有各的好,各有各的劣,总的来说,还是有比较方便的。今天小编就给大家分享一个新的技巧,支持多家快递,一次能查询多个单号的物流,还能对查询到的物流进行分析、筛选以及导出,下面一起...

快递查询工具,批量查询多个快递快递单号的物流状态、签收时间

最近有朋友在问,怎么快速查询单号的物流信息呢?除了官网,还有没有更简单的方法呢?小编的回答当然是有的,下面一起来看看。需要哪些工具?安装一个快递批量查询高手多个京东的快递单号怎么快速查询?进入快递批量...

快递查询软件,自动识别查询快递单号查询方法

当你拥有多个快递单号的时候,该如何快速查询物流信息?比如单号没有快递公司时,又该如何自动识别再去查询呢?不知道如何操作的宝贝们,下面随小编一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号若干...

教你怎样查询快递查询单号并保存物流信息

商家发货,快递揽收后,一般会直接手动复制到官网上一个个查询物流,那么久而久之,就会觉得查询变得特别繁琐,今天小编给大家分享一个新的技巧,下面一起来试试。教程之前,我们来预览一下用快递批量查询高手...

简单几步骤查询所有快递物流信息

在高峰期订单量大的时候,可能需要一双手当十双手去查询快递物流,但是由于逐一去查询,效率极低,追踪困难。那么今天小编给大家分享一个新的技巧,一次能查询多个快递单号的物流,下面一起来学习一下,希望能给大家...

物流单号查询,如何查询快递信息,按最后更新时间搜索需要的单号

最近有很多朋友在问,如何通过快递单号查询物流信息,并按最后更新时间搜索出需要的单号呢?下面随小编一起来试试吧。需要哪些工具?安装一个快递批量查询高手快递单号若干怎么快速查询?运行【快递批量查询高手】...

连续保存新单号功能解析,导入单号查询并自动识别批量查快递信息

快递查询已经成为我们日常生活中不可或缺的一部分。然而,面对海量的快递单号,如何高效、准确地查询每一个快递的物流信息,成为了许多人头疼的问题。幸运的是,随着科技的进步,一款名为“快递批量查询高手”的软件...

快递查询教程,快递单号查询,筛选更新量为1的单号

最近有很多朋友在问,怎么快速查询快递单号的物流,并筛选出更新量为1的单号呢?今天小编给大家分享一个新方法,一起来试试吧。需要哪些工具?安装一个快递批量查询高手多个快递单号怎么快速查询?运行【快递批量查...

掌握批量查询快递动态的技巧,一键查找无信息记录的两种方法解析

在快节奏的商业环境中,高效的物流查询是确保业务顺畅运行的关键。作为快递查询达人,我深知时间的宝贵,因此,今天我将向大家介绍一款强大的工具——快递批量查询高手软件。这款软件能够帮助你批量查询快递动态,一...

从复杂到简单的单号查询,一键清除单号中的符号并批量查快递信息

在繁忙的商务与日常生活中,快递查询已成为不可或缺的一环。然而,面对海量的单号,逐一查询不仅耗时费力,还容易出错。现在,有了快递批量查询高手软件,一切变得简单明了。只需一键,即可搞定单号查询,一键处理单...

物流单号查询,在哪里查询快递

如果在快递单号多的情况,你还在一个个复制粘贴到官网上手动查询,是一件非常麻烦的事情。于是乎今天小编给大家分享一个新的技巧,下面一起来试试。需要哪些工具?安装一个快递批量查询高手快递单号怎么快速查询?...

取消回复欢迎 发表评论: