Qt知识回顾(七)——界面外观

Qt风格

  Qt的各种风格是一组继承自QStyle的类。QStyle类是一个抽象基类,封装了一个GUI的外观,Qt的内建部件使用它来执行几乎所有的绘制工作,以确保它们看起来像各个平台的本地部件一样。QStyleFactory类可以创建一个QStyle对象,首先通过keys()函数获取可用的风格,然后使用create()函数创建一个QStyle对象。一般windows风格和fusion风格是默认可用的风格,而有些风格只在特定的平台上才有效。如windowsxp风格、windowsvista风格和macintosh风格。
  如果想使用不同的风格来运行程序,只需要调用QApplication的setStyle()函数来指定要使用的风格即可。需要包含头文件< QStyleFactory >。如果不想整个应用程序都使用相同的风格,那么可以调用部件的setStyle()函数来指定该部件的风格。Qt风格更多的内容可以通过Styles and Style Aware Widgets关键字查看。

  调色板QPalette类包含了部件各种状态的颜色组。一个调色板包含3种状态:激活、失效和非激活。Qt中的所有部件都包含一个调色板,并且使用各自的调色板来绘制它们自身,这样可以使用用户界面更容易配置,也容易保持一致。调色板中的颜色组包括:
  >激活颜色组:用于获得键盘焦点的窗口;
  >非激活颜色组:用于其他没有获得键盘焦点的窗口;
  >失效颜色组:用于因为一些原因而不可用的部件。
  要改变一个应用程序的颜色板,可以先使用QApplication::palette()函数来获取其调色板,然后进行更改,最后使用QApplication::setPalette()函数来使用该调色板,更改了应用程序的调色板会影响到该程序的所有窗口部件。如果要改变一个部件的调色板,则可以调用该部件的palette()和setPalette()函数,这样只会影响该部件及其子部件。
  在设置调色板颜色时可以使用setColor()函数,这个函数需要指定颜色角色。在QPalette中,颜色角色用来指定改颜色所起的作用,如背景颜色或者是文本颜色等等,主要的颜色角色如下表:

常量描述
QPalette::Window一般的背景颜色
QPalette::WindowText一般的前景颜色
QPalette::Base主要作为输入部件的背景色,也可用作QComboBox的下拉列表的背景色或者QToolBar的手柄背景色,一般是白色或其他浅色
QPalette::AlternateBase在交替行颜色的视图中作为交替背景色
QPalette::ToolTipBase作为QToolTip和QWhatsThis的背景色
QPalette::ToolTipText作为QToolTip和QWhatsThis的前景色
QPalette::Text和Base一起使用,作为前景色
QPalette::Button按钮部件的背景色
QPalette::ButtonText按钮部件的前景色
QPalette::BrightText一种与深色对比度较大的文本颜色,一般用于当Text或者WindowText的对比度较差时

Qt样式表

  Qt样式表是一个可以自定义部件外观的十分强大的机制。除了那些能够童年过子类化QStyle更改的外观,其余的都可以使用Qt样式表来美化。

Qt样式表介绍
  样式表可以使用QApplication::setStyleSheet()函数将其设置到整个,也可以使用QWidget::setStyleSheet()函数将其设置到一个指定的的部件(还有它的子部件上)。如果在不同级别都设置了样式表,那么Qt会使用所有有效的样式表,被称为样式表的层叠。

使用代码来设置样式表

//设置pushButton的背景为黄色
ui->pushButton->setStyleSheet("background::yellow");

//对所有pushButton部件设置样式表
setStyleSheet("QPushButton{background::yellow}");

使用设计模式中设置样式表
  在界面上右击,在弹出的级联菜单中选择“改变样式表”,这时会出现编辑样式表对话框,在其中输入如下代码,注意,光标停留在第一个大括号后,然后单击上面“添加颜色”后面选项的下拉箭头,则在弹出的列表中选择background-color项,这时会弹出对话框,可以随便选择一个颜色,然后单击OK按钮,则自动添加代码。当然不仅可以设置颜色,还可以使用图片,使用渐变颜色或者更改字体。这里是在MainWindow界面上设置了样式表,当然,也可以按照这种方法在指定的部件上添加样式表。

QPushButton{

}

  对于自定义样式,样式表要比调色板强大的很多。例如,可以通过设置QPalette::Button角色为红色来获得一个红色的按钮。但是,这并不能保证在所有风格中都可以正常工作,因为他受到不同平台的准则和本地主题引擎所限制。不过样式表就不受这些限制,样式表可以执行所有的那些单独使用调色板很困难或者让无法执行的自定义操作。样式表应用在当前的部件风格之上,这意味着应用程序的外观会尽可能本地化。此外,样式表可以用来给应用程序提供一个独特的外观,而不用去子类化QStyle,这样就很容易的实现大多数应用程序中拥有的换肤功能。

Qt样式表语法
  Qt的样式表的术语和语法规则与HTML CSS基本相同,可以在帮助中通过The Style Sheet Syntax关键字查看。可以从样式规则、选择器类型、子控件、伪状态、冲突解决、层叠、继承和设置QObject属性来了解。

1.样式规则
  样式表包含了一系列的样式规则,每个样式规则由选择器和声明组成。选选择器指定了受该规则影响的部件,声明指定了这个部件上要设置的属性。例如:QPushButton{color:red}在这个样式规则中,QPushButton是选择器,{color::red}是声明,其中,color是属性,red是值。这个规则制定了QPushButton和它的子类应该使用红色作为前景色。Qt样式表中一般不区分大小写,只有类名、对象名和Qt属性名是区分大小写的。一些选择器可以指定相同的声明,使用逗号隔开,QPushButton,QLineEdit,QComboBox{color:red}。样式规则的声明部分是一些“属性:值”对组成的列表,它们包含在大括号中,使用分号隔开。可以在Qt Style Sheet Reference关键字对应文档中的List of Properties一项中查看Qt样式表支持的所有属性。

2.选择器类型
Qt样式表CSS2中定义的所有选择器。下表列出了最常用的选择器类型

选择器示例说明
通用选择器*匹配所有部件
类型选择器QPushButton匹配所有QPushButton实例和它的所有子类
属性选择器QPushButton[flat = “false”]匹配QPushButton的属性flat为false的实例
类选择器.QPushButton匹配所有QPushButton实例,但不包括它的子类
ID选择器QPushButton#okButton匹配所有QPushButton中以okButton为对象名的实例
后代选择器QDialog QPushButton匹配所有QPushButton实例,他们必须是QDialog的子孙部件
孩子选择器QDialog>QPushButton匹配所有QPushButton实例,它们必须是QDialog的直接子部件

3.子控件
  对于一些复杂的部件修改样式,可能需要访问它们的子控件,比如QComboBox的下拉按钮,还有QSpinBox的向上和向下箭头。选择器可以包含子控件来对部件的特定子控件应用规则。例如QComboBox::drop-down{image:url(dropdown.png);这样的规则可以改变所有QComboBox部件的下拉按钮的样式。

4.伪状态
  选择器可以包含伪状态来限制规则在部件的指定状态上的应用。伪状态出现选择器之后,用冒号隔离,例如:QPushButton:hover{color:white},这个规则表明当鼠标悬停在一个QPushButton部件上才被应用。伪状态可以使用感叹号来表示否定,例如当鼠标没有悬停在一个QRadioButton上才应用规则,那么这个规则可以写为QRatioButton:!hover{color:red},伪状态还可以多个连用,达到逻辑与效果。例如,当鼠标悬停在一个被选中的QCheckBox部件上时才应用规则,那么这个规则可以写为:QCheckBox:hover:checked{color:white}如果有需要,也可以使用逗号来表示逻辑或操作,例如QCheckBox:hover , QCheckBox:checked{color:white},当然,伪控件也可以和子控件联合使用QComboBox::drop-down:hover{image:url(dropdown_bright.png)}

5.冲突解决
  当几个样式规则对相同的属性指定了不同的值就会产生冲突,例如QPushButton#okButton{color:gray};QPushButton{color:red};这样,okButton的color属性便产生了冲突。解决这个冲突的原则是:特殊的选择器优先。

6、层叠
  样式表可以设置在QApplication上、父部件上或者子部件上。部件有效的样式表是通过部件祖先的样式表和QApplication上的样式表合并得到的。当发生冲突时,部件自己的样式表优先于任何继承的样式表,同样,父部件的样式表优先于祖先的样式表。

7.继承
  当使用Qt样式表时,部件并不会自动从父部件继承字体和颜色设置。例如,一个QPushButton包含在一个QGroupBox中,这里对QGroupBox设置样式表:qApp->setStyleSheet("QGroupBox{color:red;}"但没有对QPushButton设置样式表。这时,QPushButton会使用系统颜色,而不会继承QGroupBox的颜色.如果想要QGroupBox的颜色设置到其子部件上,可以这样设置样式表:qApp->setStyleSheet("QGroupBox,QGroupBox *{color:red;}");

8.设置QObject
  从Qt 4.3开始,任何可设计的Q_PROPERTY都可以使用“qproperty-属性名称”语法来设置样式表。例如

MyLabel{qproperty-pixmap:url(pixmap.png);}
MyGroupBox{qproperty-titleColor:rgb(100,200,100);}
QPushButton{qproperty-iconSize:20px 20px;}

盒子模型

  当使用样式表时,每一个部件都被看作拥有4个同心矩形的盒子,这四个矩形分别是内容、填衬、边框和边距。边距、边框宽度和填衬等属性的默认值都是0,这样4个矩形恰好重合。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值