QT 样式风格

来源:互联网 发布:访客网络关闭 编辑:程序博客网 时间:2024/05/22 05:17

QT 样式风格(Style Mechanism)

作者:刘旭晖 Raymond 转载请注明出处
Email:colorant@163.com
BLOG:http://blog.csdn.net/colorant/

 

QT Style的机制和GTK的Style机制很类似,基本上就是

  • 定义了一个基础的Style类,在Style类里面定义一系列的绘图相关函数接口,具体风格的Style类实现了这些函数接口。
  • 在控件的实现中,控件的绘图函数调用Style类的绘图函数接口,绘制具体的控件UI
  • 通过使用不同的Style实现,实现全局UI风格的改变

所不同的是这些函数的的颗粒度、分类及复杂程度。此外各种局部风格调整的机制,思路也是一致的,只是在具体实现上有不同的Approach

QStyle主要函数

QStyle类提供的功能主要包括提供标准的绘图函数和一些辅助函数

绘图类函数

QStyle类将UI的组成元素分为三类

  • Primitive Elements : 基本元素,一些基本的,被多个控件所复用的元素,如边框,倒角,箭头等(注意这里的基本元素的概念,和点,线等绘图基本元素的概念不同)。基本元素本身不能单独纯在。
  • Control Elements : 控件元素,如按键,复选框等,不单是这些单独的控件,也包括复杂控件中的组成元素,如滚动条中的滑块。它和基本元素不同的地方是,它能够单独处理用户交互操作。
  • Complex Contro Elements : 复杂控件元素,复杂控件元素包含有子控件元素。例如combo boxes(复合选择框)等。它的用户交互响应,取决于用户操作的对象是哪个子控件。

所以,对应的有三个函数用于绘制这三类UI元素。因为不同的控件对各自的UI有不同的要求,具体控件在绘制自己的UI的时候,调用这些函数是,所需要的参数也会有不同,所以这三类函数基本都需要传参指定:

  • 绘制元素的类型
  • 该类型对应的具体参数(用类的方式传递,基本上绘制不同的元素都需要传递自己特定的参数类(QStyleOption的子类))
  • 用于具体绘图的QPainter类
  • 控件本身(可选)

理论上说,传递一个控件对象本身,就应该包含它绘图时所需要的参数,但是传递QStyleOption来指定参数也有好处,就是任何控件都可以绘制任意所需要的UI元素,不一定只有按键控件才能传参来绘制按键UI

辅助类函数

辅助类的函数,这里列举一部分:

  • 一组用来返回文本或子元素的边界矩形(Bounding Rect)的函数,用来获取对应元素的边界信息
  • 用来提供符合特定GUI风格标准的图标位图的函数
  • 用来获取一些风格相关尺寸信息(比如默认边框宽度,按键间距等等)的函数
  • 获取Style标准调色板的函数

调色板

每个具体的Style类都会返回一个Palette调色板类,用分组的方式(ColorGroup)定义控件在不同状态下(Disabled/Active/Inactive/Normal)的各类颜色(QColor)/画笔(QBrush)信息。在一组的颜色画笔信息中,进一步以角色(ColorRole)的形式进行检索。

 

举例来说,你可以指定 例如 Active状态(group)下按键文本(ColorRole)来获取对应的颜色/画笔信息

Style和Painter

在Style类内部,最终还是调用Painter的画图函数来执行具体的画图动作,所以同一个Style对应不同的Painter,最终显示效果可能会有不同

Style Awareness的控件/程序

通常来说,编写应用程序的时候,除非对应用程序的外观有特定的要求。否则,为了能让QT应用程序的外观能够在各种平台和风格设定的情况下都能最大程度的兼容系统设定,不应该在代码中强制指定例如颜色,字体等等外观相关的参数。

 

而如果对应用程序的外观有特定的要求,也应该尽量通过Style相关的方式来支持,例如继承定制自己的Style,或者用Style-sheet在当前Style的基础上,修改部分UI风格。

 

在实现定制的控件的时候,也应该尽量使用Style相关绘图函数来绘制控件外观,而不是直接用各类绘图函数绘制固定的外观。

设置Style

  • 你可以通过 QApplication::setStyle 或者 QWidget::setStyle 函数设置整个函数或者单个控件要使用的Style
  • 你也可以通过 -style stylename 命令行参数指定应用程序要使用的UI风格