本页内容

菜单和项目视图的样式设置

本页是“控件样式参考”的一部分。关于元素树、屏幕截图和表格的说明,请参阅该页面。每个控件设置的通用状态标志和成员在“样式如何绘制控件”中列出。

QMenu 维护一个操作列表,并将每个操作绘制为菜单项。在绘制事件中,它会先绘制菜单面板,然后使用CE_MenuItem 和QStyleOptionMenuItem 绘制每个菜单项,最后绘制边框。菜单项没有单独的标签元素,因此CE_MenuItem 会绘制复选标记、图标、文本、快捷键和子菜单箭头。

  • PE_PanelMenu,背景
  • CE_MenuItem,每个操作(PM_SmallIconSize )绘制一次
    • PE_IndicatorMenuCheckMark,用于已选中的项目。许多样式会改用PE_IndicatorCheckBox 和PE_IndicatorRadioButton 代替。
    • PE_IndicatorArrowRight 或PE_IndicatorArrowLeft ,用于会打开子菜单的项目
  • CE_MenuScroller (PM_MenuScrollerHeight ),当菜单过高超出屏幕范围且已设置SH_Menu_Scrollable 时
  • CE_MenuTearoff (PM_MenuTearoffHeight),用于tear-off 菜单
  • PE_FrameMenu (PM_MenuPanelWidth),该框架的QStyleOptionFrame 属性,其lineWidth 为PM_MenuPanelWidth
  • CE_MenuEmptyArea,对于未被项目或框架覆盖的区域

QMenu 会利用PM_MenuHMargin 、PM_MenuVMargin 、PM_MenuPanelWidth 和PM_MenuDesktopFrameWidth 自行布局项目。它还会参考许多SH_Menu_ 提示,例如SH_Menu_SubMenuPopupDelay 、SH_Menu_MouseTracking 和SH_Menu_Mask 。

一个包含图标项、已选中项、子菜单项、禁用项和普通项的菜单,每个项均有轮廓线

QMenu 在调用initFrom()后重置状态,因此项中仅包含State_Enabled 、State_Active 以及本表中的标志:

状态何时设置
State_Selected项目被高亮显示且不是分隔符时。
State_Sunken该项目被按下。
State_DownArrow该项目是一个滚动条,用于将菜单向下滚动。
State_Enabled该操作处于启用状态。即使菜单处于启用状态,禁用操作也会清除此标志。

QStyleOptionMenuItem 的成员包括:

成员描述
menuItemTypeMenuItemType 的一个值:普通项目、默认项目、分隔符、子菜单、滚动条、可拆分项目、边距或空白区域。
checkTypeCheckType 的值:不可选中、互斥或非互斥。
checked该项目是否已被选中。
menuHasCheckableItems菜单中是否至少有一个可选中项,以便样式能为复选标记预留空间。
menuRect整个菜单的矩形区域。
text项目文本。文本与快捷键之间以制表符分隔。
icon菜单项的图标。
maxIconWidth菜单中宽度最大的图标的宽度。
reservedShortcutWidth为快捷方式列预留的宽度。
font项目文本的字体。

对于CE_MenuScroller 和CE_MenuTearoff ,菜单仅设置menuItemType 、checkType 、maxIconWidth 和reservedShortcutWidth 。CE_MenuEmptyArea 还设置menuRect 。

QMenuBar 使用CE_MenuBarItem 和QStyleOptionMenuItemV2 绘制每个菜单标题,使用CE_MenuBarEmptyArea 绘制最后一个标题后的空格,并使用PE_PanelMenuBar 和QStyleOptionFrame 绘制其面板。下拉菜单是QMenu对象;参见“菜单”。

  • CE_MenuBarItem,每个菜单仅出现一次(PM_SmallIconSize )
  • PE_PanelMenuBar (PM_MenuBarPanelWidth)
  • CE_MenuBarEmptyArea

菜单栏使用PM_MenuBarItemSpacing 、PM_MenuBarHMargin 和PM_MenuBarVMargin 来布局项目,并使用CT_MenuBarItem 调整其大小。QMenuBar 传递给面板的绘制器会被裁剪至四条边框条内,每条宽度为PM_MenuBarPanelWidth ,因此面板只能绘制边框。空区域的绘制器会被裁剪至项目和边框留出的剩余空间内。该菜单栏会调用SH_MenuBar_MouseTracking 、SH_MenuBar_AltKeyNavigation 和SH_DrawMenuBarSeparator 。

在 macOS 上,QMenuBar 默认使用原生菜单栏,不会绘制任何内容。调用QMenuBar::setNativeMenuBar() 可使其采用该样式。

包含“文件”、“编辑”、“视图”和“帮助”菜单的菜单栏,每个菜单项及周围的空白区域均带有轮廓线

QMenuBar 直接填充该选项本身,而非调用initFrom()。当菜单栏启用时,它会设置State_Enabled ,并在菜单项上设置以下标志:

状态设置条件
State_Selected项目被高亮显示时。
State_Sunken项目的菜单已打开。
State_HasFocus菜单栏处于焦点状态或选中了当前项目。
State_MouseOver鼠标悬停在该项目上时。

菜单栏使用QStyleOptionMenuItem 的以下成员:

成员描述
menuRect整个菜单栏的矩形区域。
text菜单的标题。
icon菜单的图标。只有少数样式会绘制它。

对于面板,QStyleOptionFrame::lineWidth 设置为PM_MenuBarPanelWidth ,midLineWidth 设置为0。

项目视图标题

QHeaderView 使用CE_Header 和QStyleOptionHeaderV2 绘制每个标题部分。QCommonStyle 将其拆分为部分背景、标签和排序指示符:

  • CE_Header,每个部分一次(PM_HeaderMargin )
    • CE_HeaderSection
    • CE_HeaderLabel (SE_HeaderLabel)
    • PE_IndicatorHeaderArrow (SE_HeaderArrow,PM_HeaderMarkSize),用于已排序的章节
  • CE_HeaderEmptyArea,用于最后一个部分后的空白区域

标题视图使用CT_HeaderSection 调整各部分的大小,并使用PM_HeaderGripMargin 来处理用户可拖动部分边界的区域。QTableView 在两个标题交汇处的左上角绘制一个CE_Header 按钮。提示SH_Header_ArrowAlignment 用于放置排序指示器。

包含“名称”、“大小”和“修改时间”这三个标题栏的表格,其中各栏、标签和排序指示符均带有边框

标题会在部分上设置以下状态标志:

状态设置条件
State_Raised始终。标题会为每个部分设置此标志。
State_Horizontal这是视图上方的水平标题栏。
State_Sunken该部分被按下,或者该部分被选中且“highlightSections ”功能已开启。
State_On该分区中的某项被选中,且“highlightSections ”功能已开启。
State_MouseOver鼠标悬停在该分区上。仅当sectionsClickable 启用时才设置。

QStyleOptionHeader 的成员包括:

成员描述
section该节的逻辑索引。
text章节正文。
textAlignment章节内文本的对齐方式。
图标该部分的图标。
iconAlignment该部分中图标的对齐方式。
position一个SectionPosition 值:该部分相对于其他部分的位置。
selectedPositionSelectedPosition 值:所选分区相对于当前分区的位置。
sortIndicatorSortIndicator 值:无指示符,或排序箭头的方向。
orientation指定此元素是位于视图上方的水平标题,还是位于其侧面的垂直标题。

QStyleOptionHeaderV2 添加textElideMode (用于文本超出范围时的省略模式)和isSectionDragTarget (设置在被拖拽部分即将被放置的区域上)。

树分支指示符

QTreeView 使用PE_IndicatorBranch 绘制分支指示符,即显示节点之间关系的线条和箭头。它会在每个项目的正前方按缩进级别绘制一个指示符,因此深度嵌套的项目会有多个指示符。树还会使用PE_PanelItemViewRow 绘制每行的背景,并使用PM_TreeViewIndentation 对各级别进行缩进。

这两个元素均采用QStyleOptionViewItem ,因此样式还可以读取该行的配色方案、字体以及交替行功能标志。分支类型通过状态标志进行编码:

状态设置条件
State_Item指示符属于本行中的项目,而非其祖先。在此处绘制水平连接线。
State_Children该项目有子项,因此指示器显示展开或折叠箭头。
State_Open该项已展开。
State_Sibling该级别的节点下方有一个同级节点,因此垂直线向下延伸。

对于节点下方没有同级节点的层级,将绘制一个不包含上述任何标记的指示符;该样式在此处不绘制任何内容。

树形视图中,文件夹处于展开和折叠状态,分支指示单元格根据其状态标志显示轮廓并标注标签

项目视图中的项目

委托负责绘制项目视图中的项目。Qt 的默认委托 `QStyledItemDelegate` 会使用 `QStyleOptionViewItem ` 绘制 `CE_ItemViewItem `,并通过 `CT_ItemViewItem` 计算项目大小,因此即使没有相应的委托,样式也能控制项目的外观。QCommonStyle 将元素划分为背景、复选标记、装饰、文本和焦点框:

  • CE_ItemViewItem
    • PE_PanelItemViewItem
    • PE_IndicatorItemViewItemCheck (SE_ItemViewItemCheckIndicator)
    • 装饰部分由paint() 绘制 (SE_ItemViewItemDecoration)
    • 文本由QCommonStyle 负责排版和绘制,并支持文本截断和换行 (SE_ItemViewItemText)
    • PE_FrameFocusRect (SE_ItemViewItemFocusRect)

视图会参考诸如SH_ItemView_ShowDecorationSelected 、SH_ItemView_ActivateItemOnSingleClick 和SH_ItemView_ArrowKeysNavigateIntoChildren 等项视图提示。若需支持QStyledItemDelegate 无法处理的数据类型或角色,请编写自定义委托;详见《模型/视图编程》。

QStyleOptionViewItem 的状态标志和成员在其类文档中进行了描述;其中最重要的包括State_Selected 、State_HasFocus 、checkState 、decorationPosition 、displayAlignment 、features 、icon 、text 和viewItemPosition 。

另请参阅 《控件样式参考》、《按钮和输入控件的样式设置》、《容器和窗口的样式设置》以及QStyledItemDelegate 。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.