Qt中项目视图的默认委托机制是什么?

Qt中项目视图的默认委托机制是什么?,qt,pyqt,pyside,Qt,Pyqt,Pyside,短版 QTreeView使用的默认委托是什么?我特别想找到它的paint()方法 较长版本 我是Python用户(Pyside/PyQt),正在使用自定义委托重新创建QTreeView的一些功能。因此,我试图找到默认委托和绘制方法,该方法在QTreeView中使用。更好的办法是解释它是如何工作的 交叉柱 我在Qt中心(?)发布了同样的问题。tl;dr 所有项目视图的默认委托是QStyledItemDelegate。其paint()方法调用qcommonstyle.cpp中定义的drawContr

短版

QTreeView
使用的默认委托是什么?我特别想找到它的
paint()
方法

较长版本

我是Python用户(Pyside/PyQt),正在使用自定义委托重新创建
QTreeView
的一些功能。因此,我试图找到默认委托和绘制方法,该方法在
QTreeView
中使用。更好的办法是解释它是如何工作的

交叉柱


我在Qt中心(?)发布了同样的问题。

tl;dr

所有项目视图的默认委托是
QStyledItemDelegate
。其
paint()
方法调用
qcommonstyle.cpp
中定义的
drawControl()
,以绘制每个项目。因此,请仔细阅读
qcommonstyle.cpp
,了解有关如何绘制每个项目的详细信息


长格式答案

那些喜欢简洁的人应该阅读tl;dr在上面和下面。如果您仍然陷入困境(许多Python用户可能也会如此),这个答案的其余部分应该会有所帮助

I.默认委托为QStyledItemDelegate

QStyledItemDelegate
是视图中项目的默认委托。这一点在以下文件中有明确说明:

自Qt4.4以来,默认的委托实现由 QStyledItemDelegate,它被Qt的 标准视图

该文件提供了更详细的信息:

在Qt项目视图(例如QTableView)中显示模型数据时, 单个项目由代理绘制。而且,当一个项目 编辑后,它提供了一个编辑器小部件,它位于 进行编辑时的项目视图。QStyledItemDelegate是 所有Qt项目视图的默认委托,并安装在这些视图上 当它们被创建时

总之,如果您想了解任何项视图(不仅仅是树视图,还有表和列表)的基本机制,请学习
QStyledItemDelegate

定义了
qstyleditemdleegate.cpp
中的
paint()
方法。让我们看一下最后两行:

    QStyle *style = widget ? widget->style() : QApplication::style();
    style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
这里发生了两件事。首先,设置样式——通常设置为
QApplication.style()
。其次,调用该样式的
drawControl()
方法来绘制正在绘制的项目。就这样。这就是
QStyledItemDelegate.paint()的最后一行。

因此,如果您真的想弄清楚默认代理是如何绘制东西的,我们实际上必须研究样式,这是所有实际工作的基础。这就是我们在本文档其余部分将要做的

II。QStyle:是什么赋予了学员其风格?

当使用Qt显示任何内容时,它都是根据在实例化
QApplication
时以系统特定的方式选择的某种样式绘制的。发件人:

QStyle类是封装外观的抽象基类 和GUI的感觉。Qt包含一组模拟的QStyle子类 Qt(QWindowsStyle, QMacStyle、QMotifStyle等)。默认情况下,这些样式内置于 QtGui库

在Qt中,您将在
src/gui/styles/N.cpp
中找到样式N的源代码

每个样式都包含用于在GUI中绘制所有内容(从树视图到下拉菜单)的基本操作的实现。标准样式(如
qwindowstyle
)继承了
QCommonStyle
的大部分方法。每个特定样式通常只包含与该公共基础的微小偏差。因此,仔细研究
qcommonstyle.cpp
将揭示Qt开发人员发现用于绘制GUI所有部分的基本功能。它的重要性怎么强调都不为过

在下面的内容中,我们将检查与工程视图项相关的零件

III.QStyle.drawControl():对学员执行内窥镜检查

如上所述,理解绘制视图的基本机制需要检查
qcommonstyle.cpp
drawControl()
的实现,该实现从第1197行开始。请注意,在下面的内容中,当我引用行号而不提及文件名时,按照惯例,我指的是

该报告具有指导意义:

QStyle.drawControl(元素、选项、油漆工)

参数:

  • 元素–QStyle.ControlElement

  • 选项–QtGui.QStyleOption

  • painter–PySide.QtGui.QPainter

使用提供的具有样式的画师绘制给定元素 由选项…指定的选项。。。。选项参数是指向
QStyleOption
对象,并包含 绘制所需的元素

调用方通过传递
QStyle.ControlElement
标志来告诉
drawControl()
它试图绘制的元素类型。控件元素是向用户显示信息的窗口的高级组件:复选框、按钮和菜单项等。此处列举了所有控制元素:

调用
QStyledItemDelegate.paint()
was
CE\u ItemViewItem
时发送的控件元素,它只是要在项目视图中显示的项目。在
QCommonStyle.drawControl()
中,
CE\u ItemViewItem
案例从第2153行开始。让我们埋头干吧

A.subElementRect():大小很重要

关键是要确定每个项目的大小和布局。这是
drawControl()
计算的第一件事。为了获取此信息,它调用QRect textRect = subElementRect(SE_ItemViewItemText, vopt, widget);
return QSize(proxyStyle->pixelMetric(QStyle::PM_IndicatorWidth, option, widget),
    proxyStyle->pixelMetric(QStyle::PM_IndicatorHeight, option, widget));
drawPrimitive(PE_PanelItemViewItem, option, painter);
p->fillRect(vopt->rect, vopt->backgroundBrush);
viewItemDrawText(painter, vopt, textRect);