1.前言

为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章。说明如下:

  1. 《QStyle类用法总结(一)》。该文是对Qt自定义风格简单描述,对QStyle及其相关类作了概念性的描述。
  2. 《QStyle类用法总结(二)》。该文是对QStyle及其相关类作了详细描述。
  3. 《QStyle类用法总结(三)》。也就本博文,对QStyle中的各widget元素的层次继承树做了详细描述。
  4. 《QProxyStyle用法简述》。通过一个简单的例子,演示了QProxyStyle类用法。
  5. 《QStyle实现自绘界面项目实战(一)》。通过一个实战化例子,讲解了如何自定义风格的实现。
  6. 《QStyle实现自绘界面项目实战(二)》通过项目实战来理解前几篇提到的内容,理解QStyle及其子类在自绘时的工作机制。

本文是接续上篇《QStyle类用法总结(二)》而写。

2.widget属性

在后文描述中,对每种widget,给出如下几项:

  • 一个表格,该表格包含了每种widget对应的style option相应的成员变量说明。
  • 状态标志表格。该表格数据来自于枚举QStyle::StateFlag中的值,这些枚举值能够设置到widget上,从而表示widget的某种状态。
  • 图形层次树(参见《QStyle类用法总结(二)》中4节“风格元素”)。
  • widget图形元素层次树的缩略图。

元素树包含primitive、control、 complex风格元素。通过从元素树顶部到底部遍历,可以得到需要绘制元素的序列。在绘制层次树节点表示的元素时,还需考虑树节点中列出的子元素外包围矩形、子控件元素、像素度量信息。

2.1. widget通用属性

某些状态、变量对所有widgets是通用的。通过QStyleOption::initFrom()函数来设置它们。但不是所有的元素都用这个函数来设置。该函数被widgets创建风格选项(style options);然而对某些元素来说,来自QStyleOption::initFrom()中的某些信息是不需要的。下表列出了通用状态:

widget通用成员变量如下:

  • rect:被绘制的元素的最小外包围矩形。
  • direction:布局器方向;其是Qt::LayoutDirection枚举值。
  • palette:绘制元素时用到的调色板。
  • fontMetrics:当绘制widget中的文本时,用来计算文本的各种尺寸。

继承自QStyleOptionComplex的复杂控件风格选项被用于风格化复杂控件中的子元素。复杂控件风格选项有subControls 和 activeSubControls变量。这两个变量可以用或(|)操作进行组合。这意味这个子控件QStyle::SubControl也是当前复杂控件的活动子控件。

2.2. 各种widget元素层次树

widget层次树以树的形式列出构成每种widget的元素、元素占据的外包围矩形。其中处于叶子节点的以PE开头的元素通过drawPrimitive函数来绘制,处于叶子节点的以CE开头的元素通过drawControl函数绘制。关于PE、CE开头的元素的区别,请参见《QStyle类用法总结(二)》文章。通过对树从顶部到底部做遍历,可以得到被绘制元素的序列。

2.2.1.Push Buttons(按钮)

push buttons的结构树状图如下:

图1:按钮层次结构树

各个元素在button上表示的区域位置示意图如下:

图2:按钮各元素示意图

绘制按钮的信息一般都包含在QStyleOptionButton类对象中。QStyleOptionButton类的state成员变量包含按钮的各状态及状态何时设置,如下表描述:

状态

状态何时

被设置

State_Sunken

按钮被按下或菜单被按下显示时

State_On

按钮(一般指复选框、单选框)被选中

State_Raised

按钮不是扁平的且没被按下

QStyleOptionButton类还包含下表成员变量:

成员变量名 含义

features

其取值是枚举

QStyleOptionButton::ButtonFeatures

中某一个,表示按钮的类型

icon

按钮图标(如果有图标)

iconSize

按钮图标大小(如果有图标)

text

按钮上的文本

2.2.2.Check 、Radio Buttons (复选、单选按钮)

结构树状图如下:

图3 复选、单选按钮元素层次结构树

同push button一样,绘制复选、单选按钮的信息也包含在QStyleOptionButton类对象中。QStyleOptionButton类的state成员变量包含按钮的各状态及状态何时设置,如下表描述:

状态 状态何时被设置

State_sunken

按钮被按下

State_NoChange

按钮被部分选中

(仅仅对三态复选框有效)

State_On

按钮被勾选

State_Off

按钮取消勾选

其它成员变量和push button一样,参见push button描述。

2.2.3.Tabs(tab页签)

tabs要么存在于QTabWidget中,要么作为一个单独的bar存在。如果bar不是tab widget的一部分,则它绘制自己基本部分。QTabBar对其上的tabs进行布局,所以风格不会对其tabs进行排列控制。然而,当布局tabs时,bar会向style请求PM_TabBarTabHSpace 和 PM_TabBarTabVSpace,这两个值表示相对最小tab文本或图标的额外宽度和高度。在对tab布局之前,style能进一步影响到tab的尺寸大小。

结构树状图如下:

图4 tabwidget层次结构图树

各个元素表示的区域位置示意图如下:

图5 tab bar 各元素区域位置图

图5 tab bar 各元素区域位置图

绘制tabs的信息一般都包含在QStyleOptionTab类对象中。QStyleOptionTab类的state成员变量包含tabs的各状态及状态何时设置,如下表描述:

状态 状态何时设置

State_Sunken

tab被鼠标按下

State_Selected

该tab是当前tab

State_HasFocus

该tab有焦点且被选中

QStyleOptionTab类还包含下表成员变量:

成员变量 含义

cornerWidgets

角部件枚举。指示某个窗体部件插入到tab控件的哪个角

icon

图标。

iconSize

图标大小。

position

TabPosition类型枚举值。指示在tab bar上

相对其它tab的位置

row

tab位于哪一行,类似tab的索引号

selectedPosition

SelectedPosition类型枚举。描述被选中tab的位置。一些

风格在绘制某些tab时,需要依据是否和被选中的tab相邻。

shape

QTabBar::Shape类型枚举,指示tab是圆角还是三角形及放置的方向。

text

tab上的文本。

cornerWidgets理解如下:

#include "QtWidgetsApplication1.h"
#include<QPushButton>
QtWidgetsApplication1::QtWidgetsApplication1(QWidget *parent): QWidget(parent)
{ui.setupUi(this);QPushButton* pBtn = new QPushButton("fff", this);ui.tabWidget->setCornerWidget(pBtn, Qt::TopLeftCorner);
}

上述代码将QPushButton插入了QTabWidget控件的左上角,运行界面如下:

图6 tab bar 角落窗体部件

用QStyleOptionTabWidgetFrame来描述tab widgets的边框,下面列出了它的成员变量,它仅仅包含一些常用属性,并没有对这些属性进行状态设置。

成员变量 含义

leftCornerWidgetSize

左角落中的widget部件尺寸大小

(如果存在widget部件)

rightCornerWidgetSize

右角落中的widget部件尺寸大小

(如果存在widget部件)

lineWidth

面板线宽度

midLineWith

该值当前一直为0

shape

tab bar中的tab的形状

tabBarSize

tab bar的尺寸大小

2.2.4.Scroll Bars(滚动条)

滚动条的风格树结构如下:

图7 Scroll Bars 层次树结构

QScrollBar简单创建它自己的风格选项(style option),然后绘制CC_ScrollBar。一些styles利用PE_PanelButtonBevel标识绘制添加的页和子页。用箭头指示器绘制滚动到上一行、下一行的指示器。上面的树中并没有包含PE_PanelButtonBevel和箭头指示器,因为它们跟各自要实现的风格有关。style的PM_MaximumDragDistance标识最大距离。该距离以像素为单位,该距离表示拖动鼠标能在滚动条上移动的最大距离。

图8 tab bar 各元素区域位置图

滚动条的状态能在其风格选项(style option)中设置,如下为其状态:

状态 状态何时被设置

State_Horizontal

滚动条呈水平状态时

QScrollBar的风格选项 QStyleOptionSlider类,下表列出其成员变量,这些风格选项被所有

QAbstractSliders使用,下表仅仅列出和滚动条相关的成员变量:

成员名 含义

maximum

滚动条最大值

minimum

滚动条最小值

notchTarget

滚动条刻痕之间占据的像素数

orientation

其是Qt::Orientation类型枚举。

指示滚动条当前是水平方向还是垂直方向。

pageStep

滚动条上翻或下翻一页时,滑块移动的值。

singleStep

滚动条上翻或下翻一行时,滑块移动的值。

sliderValue

滑块当前值。

sliderPosition

滑块手柄的位置。如果滚动条的

QAbstractSlider::tracking属性被启用,则该值和sliderValue相同;如果没启用,则手柄被用户按住鼠标一直拖动时,不会更新该值,只有用户释放鼠标时,该值才会更新。

upsideDown

该属性保存滚动条增加滑块值的方向。对所有抽象的

sliders,该属性用于替代QStyleOption::direction枚举。

2.2.5.Sliders(滑块)

当计算Slider的尺寸时,将从style中查询PM_SliderThickness 、PM_SliderLength。同滚动条一样,QSlider仅仅让用户在slider控件包围矩形的PM_MaximumDragDistance范围内移动手柄。当绘制自己的时候,它创建风格选项且用CC_Slider作为参数调用drawComplexControl函数。

Slider的风格树结构如下:

图8 QSlider 层次树结构

图9 QSlider 各元素区域位置图

QSlider 利用 QStyleOptionSlider类对象来绘制,就像所有的l QAbstractSliders 类做的一样。下表列出能够影响QSlider 的成员变量:

成员名 含义

maximum

最大值

minimum

最小值

notchTarget

刻痕之间占据的像素数

orientation

其是Qt::Orientation类型枚举。

指示当前是水平方向还是垂直方向。

pageStep

上翻或下翻一页时,滑块移动的值。

singleStep

上翻或下翻一行时,滑块移动的值。

sliderValue

滑块当前值。

sliderPosition

手柄的位置。如果

QAbstractSlider::tracking属性被启用,则该值和sliderValue相同;如果没启用,则手柄被用户按住鼠标一直拖动时,不会更新该值,只有用户释放鼠标时,该值才会更新。

upsideDown

该属性保存增加滑块值的方向。对所有抽象的

sliders,该属性用于替代QStyleOption::direction枚举。

注意:slider并没有用到反向布局(如:从右到左),它用的是upsideDown。

2.2.6.Spin Boxes

          当QSpinBox 绘制自己时,它创建一个QStyleOptionSpinBox类对象且向style请求绘制CC_SpinBox。编辑域是spin box子控件,编辑域尺寸大小是被风格通过SC_SpinBoxEditField参数计算出来的。

下面是spin boxes风格元素树结构图:

图10 QSpinBox 层次树结构

它并不要求风格用按钮面板图元去绘制指示器背景。

图11 QSpinBox 各元素区域位置图

QStyleOptionSpinBox类是QSpinBox风格选项类。它能为spin box 设置下面表格的状态:

状态 状态何时被设置

State_Sunken

当用户用鼠标按住

CC_SpinUp 、 CC_SpinDown即上下箭头时被设置

下表列出QStyleOptionSpinBox类成员变量:

属性 功能

frame

如果该值为true,则

spin box将会绘制边框。

buttonSymbols

ButtonSymbols类型枚举,

该枚举决定上下箭头按钮显示的符号

stepEnabled

StepEnabled类型枚举,

指示spin box中的哪个按钮被按下

2.2.7.Title Bar 

title bar 复杂控件CC_TitleBar,被用来绘制QMdiArea(多文档窗体部件)内部窗体的标题栏。它典型有窗体标题、关闭按钮、最小最大化按钮、系统菜单构成。一些风格还提供显隐窗体按钮、上下文帮助按钮。CC_TitleBar没有任何子元素,风格如何绘制按钮和风格相关。风格元素结构树如下:

图12 Title Bar 层次树结构

图13  Title Bar 各元素区域位置图

QStyleOptionTitleBar是 Title Bar的风格选项类,其成员变量如下:

成员 含义

icon

标题栏图标

text

标题栏文本

windowFlags

Qt::WindowFlag类型枚举,

QMdiArea用该枚举来管理其下的窗体

titleBarState

QWidget::windowState类型枚举,指出了标题栏所在窗体的状态,如:是否全屏、最大化、激活等。

2.2.8.Combo Box(组合框)

QComboBox用风格绘制以CC_ComboBox 、 CE_ComboBoxLabel表示的按钮和不可编辑框的文本。用户点击combo box弹出的列表是通过delegate来绘制的。通过style用SC_ComboBoxListBoxPopup可以combo box弹出列表的大小和位置;通过SC_ComboBoxEditField可以对combo box的编辑框进行控制。风格元素结构树如下:

图14Combo Box层次树结构

图15  Combo Box各元素区域位置图

SC_ComboBoxEdit域既被QComboBox用来计算编辑域大小(size)又被风格用来计算combo box标签大小。QStyleOptionComboBox是Combo Box风格选项类,该类包含的状态及状态何时被设置,如下表描述:

状态 该状态何时被设置

State_Selected

编辑框不可编辑且具有焦点

State_Sunken

SC_ComboBoxArrow

即Combo Box的箭头处于激活时

State_on

Combo Box项的列表是可见、弹出时

QStyleOptionComboBox成员变量及含义:

成员变量 含义

currentIcon

当前选择项的图标

currentText

当前选择项的文本

editable

Combo Box是否可编辑

frame

combo box是否有边框

iconSize

当前项的图标大小

popupRect

combo box弹出的下拉列表框的外包围矩形

2.2.9.Group Boxes(组框)

当计算Group Boxes尺寸大小时,QGroupBox从风格中取出PM_IndicatorWidth、PM_CheckBoxLabelSpacing、PM_IndicatorHeight三个像素度量标识。QGroupBox风格元素树如下:

图16 group Box层次树结构

图17 group box各元素区域位置图

Qt并没有强制规定怎样绘制group box上的check box子控件。QStyleOptionGroupBox是

group box风格选项类,该类包含的状态及状态何时被设置,如下表描述:

状态 状态何时设置

State_On

group box上的check box子控件被勾选

State_Sunken

group box上的check box子控件被按下

State_Off

group box上的check box子控件取消勾选

或group box没有check box子控件

QStyleOptionComboBox成员变量及含义如下表:

成员名 含义

features

QStyleOptionFrame::FrameFeatures类型枚举

描述group box边框

lineWidth

用于绘制面板的线宽度,该值一直为1

text

group box文本

textAlignment

group box文本对齐方式

textColor

group box文本颜色

2.2.10. Splitters(分裂器)

分裂器的结构简单且并没包含任何子元素,所以这里就不给出其结构图。CE_Splitter并没用到任何子元素和度量标识。分裂器用基类QStyleOption作为其风格选项类,它能设置下述状态标记:

状态 状态何时被设置

State_Horizontal

当该分裂器是水平分裂器时

QSplitter并没有调用initFrom()函数来设置自己的风格选项;它自己设置State_MouseOver and State_Disabled状态。

2.2.11. Progress Bar(进度条)

CE_ProgressBar子元素被QProgressBar使用,且是为一个被使用的子元素。Progress Bar(进度条)元素结构树如下:

图18 Progress Bar层次树结构

图19 Progress Bar各元素区域位置图

QProgressBar的风格选项类是QStyleOptionProgressBar类。 Progress Bar并没有设置任何状态标志,但是其它QStyleOptionProgressBar类成员如下表所示:

成员 成员含义

minimum

 Progress Bar最小值

maximum

Progress Bar最大值

progress

Progress Bar当前值

textAlignment

Progress Bar文本对齐方式

textVisible

Progress Bar文本是否被绘制

text

Progress Bar的文本

orientation

Progress Bar是水平还是垂直

invertedAppearance

Progress Bar是否被反转(例如:对水平进度条来说,进度从右到左)

bottomToTop

如果为true,对于垂直进度条,则使进度条文本逆时针旋转90°

2.2.12.Tool Buttons(工具栏按钮)

Tool buttons要么自己单独存在,要么作为工具栏的一部分存在,在这两种情况下,它们绘制的方式是一样的。QToolButton绘制的时候仅仅用到了CC_ToolButton风格子元素。如下是其风格元素结构树:

图20Tool buttons层次树结构

图21 Tool buttons元素区域位置图

tool buttons状态表如下:

状态 状态何时被设置

State_AutoRise

tool button的autoRise属性被设置时

State_Raised

The button不是sunken

(例如:不是通过鼠标使按钮被勾选或按下)

State_Sunken

按钮通过鼠标被按下

State_On

按钮是checkable的且被勾选

QStyleOptionToolButton作为其风格选项类,其成员如下:

成员名 含义

arrowType

Qt::ArrowType类型枚举。该枚举值表示了按钮箭头方向

(如果一个箭头被用在icon的位置)

features

QStyleOptionToolButton::ButtonFeature类型枚举。描述

了按钮是否有箭头、菜单、弹出延迟特性。

font

按钮文本上的字体

icon

按钮图标

iconSize

按钮图标尺寸

pos

按钮位置,一般通过

QWidget::pos()设置

text

按钮文本

toolButtonStyle

Qt::ToolButtonStyle enum类型枚举值。该值描述了

按钮是否显示图标、文本、或者图标文本都显示

2.2.13.Toolbars(工具栏)

Qt中的Toolbars有三个元素组成:CE_ToolBar、PE_IndicatorToolBarHandle、 PE_IndicatorToolBarSeparator。QMainWindowLayout计算外包围矩形(例如:位置和toolbars的大小尺寸及它们的内容)。主窗体也利用Toolbars中项的sizeHint()函数去计算工具栏的大小尺寸。Toolbars风格元素层次结构树如下:

图22.Toolbars元素层次结构树

虚线表示QToolBar有一个QToolBarLayout类的实例对象,QToolBarLayout类有一个QToolBarSeparators类对象。当toolbar浮动时(例如:有它自己的窗体),PE_FrameMenu元素被绘制,否则QToolBar仅仅绘制CE_ToolBar。

图23 Toolbars元素区域位置图

QToolBarSaparator用QStyleOption作为它的风格选项,当toolbar是水平时,QToolBarSaparator设置State_Horizontal标志,否则,它使用initFrom()函数来初始化。

QToolBar风格选项类为QStyleOptionToolBar类,当工具栏呈水平放置时,其唯一的状态标志(属于通用状态标志)被设置为State_Horizontal。QStyleOptionToolBar类成员及含义如下表:

成员 含义

features

表示工具栏是否可移动。其是

QStyleOptionToolBar::ToolBarFeatures枚举值类型。要么是可移动的,要么是不可移动。

lineWidth

tool bar边框线宽度

midLineWidth

该变量当前未被使用,一直为0

positionOfLine

位于the toolbar区域之内的the toolbar线的位置

positionWithinLine

位于the toolbar线内的the toolbar位置

toolBarArea

the toolbar能够活动的区域

2.2.14. Menus(菜单)

当QMenus收到绘制事件时,它计算每个菜单项且用CE_MenuItem各自绘制菜单项。菜单项并没和它的标签文本(内容)通过某个元素隔开,所以全部绘制工作都在CE_MenuItem实现。菜单项通过PE_FrameMenu绘制菜单边框。如果风格支持滚动,菜单项也会绘制CE_MenuScroller。如果菜单很大(一般是菜单项很多导致的),导致菜单的外包围矩形很大,则CE_MenuTearOff会被绘制。在下面的风格结构树中,我们也包含QMenu,因为QMenu也计做了一些风格相关的工作。当菜单被显示或调整大小时,size hint作用于菜单项的外包围矩形的计算。

图24.Menus元素层次结构树

CE_MenuScroller 和CE_MenuTearOff 被QCommonStyle处理且一般不会显示除了菜单太大而不能适应屏幕(即在屏幕下显示全部的菜单项)。仅仅只有弹出菜单才会绘制PE_FrameMenu。

如果风格支持,QMenu将会基于它的actions并且调用CE_MenuItem和CE_MenuScroller来计算外包围矩形。

通常用PE_IndicatorCheckBox(代替用PE_IndicatorMenuCheckMark)和PE_IndicatorRadioButton来绘制checkable类型菜单项;在上面的风格树中并没有包含PE_IndicatorCheckBox和PE_IndicatorRadioButton,原因是这是可选的,且不同风格差别很大。

图25 menus元素区域位置图

菜单项的风格选项类是QStyleOptionMenuItem类,状态及状态何时设置,如下面所示:

风格

风格何时

被设置

State_Selected

鼠标在action上面且该

action不是一个分隔器

State_Sunken

鼠标在菜单项上按下

State_DownArrow

如果菜单项目是一个菜单滚动器且它向下滚动菜单

成员及含义如下表:

成员 含义

checkType

CheckType类型枚举值。

不可勾选、互斥、非互斥 三个值中的某一个

checked

如果菜单项被勾选,则该值为true

font

菜单项文本的字体

icon

菜单项的图标

maxIconWidth

菜单项图标最大允许宽度

menuHasChecableItem

菜单中至少有一个菜单项是

checkable的,则该值为true

menuItemType

菜单项类型,其是

MenuItemType枚举中的某一个值

menuRect

菜单项所在菜单的外包围矩形

tabWidth

菜单项文本和该菜单项快捷热键的距离值

text

菜单项的文本

风格选项有关CE_MenuTearOff 和CE_MenuScroller中也用到了QStyleOptionMenuItem。它们在QStyleOption中的initFrom()函数中仅仅设置了menuRect成员变量。

2.2.15. Menu Bar(菜单栏)

QMenuBar用style去绘制每个菜单栏中的菜单及菜单栏中的空白区域。菜单栏元素结构树如下:

图26.Menu bar 元素层次结构树

面板和空区域被绘制在菜单项的后面。QMenuBar的QPainter会向style发送绘制菜单项需要裁剪的矩形,所以不需要在菜单项上过度关心。当计算菜单项的外包围矩形时,QMenuBar的像素度量会被用到。

图27 menu bar元素区域位置图

QStyleOptionMenuItem类对象被用于绘制菜单栏中的菜单项。其成员变量如下表:

成员 含义

menuRect

该菜单项才该菜单栏中占据的矩形区域

text

菜单项中的文本
icon 菜单项中的图标

QStyleOptionMenuItem也被用来绘制CE_EmptyMenuBarArea。QStyleOptionFrame被用来绘制面板边框。lineWidth被设置为PM_MenuBarPanelWidth,midLineWidth当前一直被设置为0。

2.2.16. Item View Headers(项、视图、头)

style绘制Qt项视图中的表头,项视图保持各自的尺寸。代理(delegates)会用style绘制各种和项相关的装饰和边框。例如:绘制E_FrameFocusRect 和PE_IndicatorViewItemCheck

图28.Item View Headers元素层次结构树

下图显示了QTableWidget各种外包围矩形:

图29.Headers各种外包围矩形

QHeaderView 用CT_HeaderSection, PM_HeaderMargin、PM_HeaderGripMargin用于大小尺寸及碰撞测试计算。PM_HeaderMarkSize当前并没有被Qt使用。QTableView绘制左上角(如:垂直表头和水平表头相交的区域)按钮当作为CE_Header来绘制。

视图表头风格选项类是QStyleOptionHeader,其成员变量如下表所示:

成员 含义

icon

头视图的图标

iconAlignment

头视图图标对齐方式

orientation

Qt::Orientation类型枚举值。指示头视图方向:水平时,在数据视图上面,垂直时,在数据视图左边。

position

QStyleOptionHeader::SectionPosition类型枚举。该值表示头区域(列)相对其它区域(列)位置。

section

保持被绘制的区域(列)

selectedPosition

QStyleOptionHeader::SelectedPosition枚举值。该值表示被选中区域(列)相对正在绘制区域(列)位置。

sortIndicator

QStyleOptionHeader::SortIndicator类型枚举值。该值表示

排序区域(列)的排序指示器方向。

text

当前绘制区域(列)的文本。

textAlignment

在头区域(列)的文本对齐方式。

2.2.17. Tree Branch Indicators(树分支指示器) 

风格通过PE_IndicatorBranch绘制树分支指示器。树分支指示器描述了树中各个子节点之间关系。通用QStyleOption风格类被发送给style用来绘制元素,QStyleOption风格类中的状态成员用来描述各种不同分支类型。因为没有特定的风格选项类型,下表仅仅列出各种状态:

状态 状态何时被设置

State_Sibling

树中的节点有兄弟节点

State_Item

分支指示器有一个项

State_Children

分支指示器有孩子节点

State_Open

分支指示器是一个打开的子树

tree view ( tree widget)用风格绘制树分支(节点)。下图每种状态用指定颜色矩形来标识:

图30.树分支状态图

2.2.18. Tool Boxes(工具箱)

QToolBox是一个容器,该容器保持多个widget,其中的每个widget都会有一个tab进行管理,每次在同一时刻,只能展示其中的一个tab页。工具箱通过QVBoxLayout布局器来布局其中展示的控件。风格层次树如下:

图31.QToolBox元素层次结构树

图32 QToolBox元素区域位置图

tool boxes风格选项类是QStyleOptionToolBox,它包含文本和工具箱内容图标。被QToolBox唯一设置的状态是State_Sunken,当用户用鼠标按下一个tab时,该状态会被设置,余下的成员变量如下表:

成员 含义

icon

toolbox的tab页图标

text

toolbox的tab页文本

2.2.19.Size Grip(尺寸调节手柄)

size grip通过CT_SizeGrip来计算其大小尺寸。像素度量参数PM_SizeGripSize当前没有被Qt使用。其树层次结构图如下:

图33.size grip元素层次结构树

图34.size grip元素区域位置图

上图显示了QMainWindow右下角的size grip控件。size grip风格选项类是QStyleOptionSizeGrip类,该类有一个成员变量如下表:

成员 含义

corner

Qt::Corner类型枚举。描述size grip控件

位于窗体部件的哪一个角落

2.2.20.Rubber Band(橡皮筋)

QRubberBand类层次树如下:

图35.Rubber Band元素层次结构树

QMdiArea内的一个窗体通过Rubber Band被移动如下图所示:

 图36.Rubber Band元素区域位置图

rubber bands风格选项类是QStyleOptionRubberBand类,它的成员变量及含义如下表:

成员名 含义

opaque

该值为true时,则

rubber band以不透明风格来绘制

shape

QRubberBand::Shape枚举。保持橡皮筋的形状,

如:矩形还是直线

2.2.21.Dock Widgets(停靠窗体部件)

当dock widget布局它内容时,它向style请求PM_DockWidgetSeparatorExtent、 PM_DockWidgetTitleBarButtonMargin、PM_DockWidgetFrameWidth、 PM_DockWidgetTitleMargin。通过SE_DockWidgetCloseButton 、SE_DockWidgetFloatButton计算浮动和关闭按钮的外包围矩形。其层次结构树如下:

图37.Dock Widgets层次结构树

虚线表示发送者持有箭头指向的接收者的一个实例(例如:它不是一个被绘制的风格元素)。当dock widget 从主窗体分离时(例如:它是一个顶层窗体),dock widget仅仅只绘制PE_frameDockWidget;如果dock widget被停靠,则它绘制停靠指示器通过调整手柄。

图38.Dock Widgets元素区域位置

dock widget风格选项类为:QStyleOptionDockWidget,其成员变量及含义如下表:

成员名 含义

closeable

布尔值。保存

Dock Widgets是否能够被关闭属性

floatable

布尔值。保存Dock Widgets是否能浮动(即从主窗体分离)

movable

布尔值。保存Dock Widgets是否能移动

title

Dock Widgets标题

Dock Widgets按钮风格选项类采用QStyleOptionButton类,该类说明参见Tool Buttons小节描述。dock widget的大小调节手柄风格选项采用通常的QStyleOption类。

QStyle类用法总结(三)相关推荐

  1. QStyle类用法总结(二)

    1.前言 为了更容易搞懂Qt自定义风格绘制,在平时开发中,实现定制自己风格的UI,本人推出有关QStyle自定义风格系列文章.文章链接如下: <QStyle类用法总结(一)>.对Qt自定义 ...

  2. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  3. python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析

    本文实例讲述了Python XlsxWriter模块Chart类用法.共享给大家供大家参考,详细如下: 一 点睛 Chart类是XlsxWriter模块中图表组件的基类,支持的图表类型包括面积.条形图 ...

  4. wxWidgets:wxVariant类用法

    wxWidgets:wxVariant类用法 wxWidgets:wxVariant类用法 用法详细说明 wxWidgets:wxVariant类用法 用法详细说明 #include <wx/v ...

  5. wxWidgets:wxStaticText类用法

    wxWidgets:wxStaticText类用法 wxWidgets:wxStaticText类用法 用法详细说明 wxWidgets:wxStaticText类用法 用法详细说明 #include ...

  6. wxWidgets:wxRegEx类用法

    wxWidgets:wxRegEx类用法 wxWidgets:wxRegEx类用法 用法详细说明 wxWidgets:wxRegEx类用法 用法详细说明 #include <wx/regex.h ...

  7. wxWidgets:wxPGMultiButton类用法

    wxWidgets:wxPGMultiButton类用法 wxWidgets:wxPGMultiButton类用法 用法详细说明 wxWidgets:wxPGMultiButton类用法 用法详细说明 ...

  8. wxWidgets:wxCheckBox类用法

    wxWidgets:wxCheckBox类用法 wxWidgets:wxCheckBox类用法 用法详细说明 wxWidgets:wxCheckBox类用法 用法详细说明 #include <w ...

  9. java 泛化_Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息 ...

最新文章

  1. 逆天了:Nature一篇论文57000位作者,更厉害的是,大多数作者都是游戏玩家
  2. 验证python安装_Python环境搭建(安装、验证与卸载)
  3. nginx rewrite php参数,Nginx泛域名解析及Rewrite重定向普通页面及带参数的页面
  4. CCCC-GPLT L1-036. A乘以B 团体程序设计天梯赛
  5. python姓名转拼音_实用小技巧,Python一秒将全部中文姓名转为拼音!
  6. 蒙特卡洛之布丰投针(python实现)
  7. 中层领导力:西点军校和哈佛大学共同讲授的领导力教程读书摘要
  8. 传播正能量——做一个快乐的程序员
  9. 快慢缓急总相宜|ONES 人物
  10. 百万调音师—Audition单轨编辑
  11. 模糊数学 2、基本的一些模糊矩阵,以及模糊矩阵的运算
  12. nginx交叉编译流程
  13. 紫外线传感器用于天然气燃烧火焰探测
  14. [译] 项目什么时候需要 React 框架呢?
  15. 【Visual C++】游戏开发笔记四十四 浅墨DirectX教程十二 网格模型和X文件使用面面观
  16. 如何将flac转换mp3的简单操作方式
  17. 知识图谱实战应用12-食谱领域智能问答系统,实现菜谱问答
  18. H5页面(八)常见的问题二------填坑
  19. opencv 图像金字塔
  20. 定位匹配 模板匹配 地图_什么是地图匹配?

热门文章

  1. PP越狱助手官方最新版 v1.6.0 绿色版
  2. 体会extends与implements的区别
  3. python智能家居论文_毕业设计(论文)-基于树莓派的智能家居精选.docx
  4. 目前流行的几种软件的压缩比较
  5. vmware convert P2V 错误二三事
  6. 智能物联网实验室落地 百度云与恩智浦、深圳大学打造AI+IoT高校生态
  7. eui插件不显示人物服务器,WOW下了个eui插件,不当心把伤害统计给关掉了结果现在死活找不到在哪。。...
  8. 应用层、传输层、网络层常用协议
  9. spss统计软件分析学习笔记lt;二gt;
  10. 单片机入门(实现流水灯)--适合初学者