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()
wasCE\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);