天天看点

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

作者:QT教程

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。

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

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

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

继续阅读