//这个实在是难翻译,很多地方直译,因为我也没看懂
 
细微控制:
为了风格化复杂的widget,那是必须的进行widget的细微控制。例如一个QComboBoxdrop-down按钮,或者一个QSpinBox的上下线。选择器可能包含细微控制,使限制一个规则的应用来说明widget细微控制。例如:
QComboBox::drop-down { p_w_picpath: url(dropdown.png) }
上面的规则风格化所有的QComboBox的上下按钮。尽管双冒号::语句像CSS3Pseudo-ElementsQt的细微控制不同于这些,有不同的级联语义。
细微控制总是定位根据另一个元素--—一个参考元素。这个参考元素能是widget或者另一个细微控制。例如,一个QComboBox的::drop-down被定位,缺省的,在QComboBox衬底矩形的右上角。::drop-down被定位,缺省的,在::drop-down微调内容矩形的中心。看
List of Stylable Widgets来风格化一个widget和他们缺省的位置。
起点能被改变通过使用subcontrol-origin。例如,如果我们想定位drop-downQComboBox空白处代替缺省的衬底部分,我们能这样:
QComboBox {
     margin-right: 20px;
 }
 QComboBox::drop-down {
     subcontrol-origin: margin;
 }
drop-down的对齐在空白矩形范围可以通过subcontrol-position改变。宽度和高度属性能被用来控制微调的大小。注意设置一个图片潜在的设置了微调的大小。
相对位置的设置方法(positionrelative),允许微调的位置抵消他的原来的位置。例如,当QComboBoxdrop-down按钮被按下,我们可能想要一种被按下的效果。如下:
QComboBox::down-arrow {
     p_w_picpath: url(down_arrow.png);
 }
 QComboBox::down-arrow:pressed {
     position: relative;
     top: 1px; left: 1px;
 }
绝对位置的设置方法(positionabsolute),允许微调的位置和大小被改变与参考元素相关。一旦定位,他们被对待和widget一样,能被风格化通过使用box model。看 List of Sub-Controls为支持的微调。
注意:对于复杂的widget例如QComboBoxQScrollBar,如果一个属性或者微调被定制,所有其他的属性或者微调必须也被定制。
虚假状态:
选择器可能包含虚假状态,指出限制那些基于widget状态规则的应用。虚假状态出现在选择器的结尾,用一个冒号(:)。例如
QPushButton:hover { color: white }
虚假状态能被取反,通过使用叹号操作。例如
QRadioButton:!hover { color: red }
虚假状态能被连接,相当于逻辑与。例如
QCheckBox:hover:checked { color: white }
QPushButton:hover:!pressed { color: blue; }
也可以用逗号代替
QCheckBox:hover, QCheckBox:checked { color: white }
虚假状态也能和微调结合
QComboBox::drop-down:hover { p_w_picpath: url(dropdown_bright.png) }
冲突解决:
冲突产生,当一些风格语句改变相同的属性,使用不同的值。考虑下面的风格语句:
QPushButton#okButton { color: gray }
 QPushButton { color: red }
为解决这个冲突,我们必须了解选择器的特性。在上面的例子中,QPushButton#okButton是被认为更特别的比起QPushButton,因为他代表单个的对象,不是所有的一个类的例子。
同样的,带虚假状态的选择器是更特别的比起没有虚假状态的。因此,下面的风格语句表明:
当一个鼠标滑过QPushButton时,有白色的text,否则红色text
QPushButton:hover { color: white }
 QPushButton { color: red }
这是一个复杂的。
QPushButton:hover { color: white }
 QPushButton:enabled { color: red }
两个选择器有相同的特性,所以如果鼠标滑过按钮当他使能时,第二个规则取得优先权。如果我们想要text在那种情况为白色,我们可以这样
QPushButton:enabled { color: red }
 QPushButton:hover { color: white }
作为选择,我们也可以使第一个规则更特别
QPushButton:hover:enabled { color: white }
 QPushButton:enabled { color: red }
一个相同的问题产生,
QPushButton { color: red }
 QAbstractButton { color: gray }
两个规则都应用于QPushButton,因为QPushButton继承QAbstractButton,他可能试着假设QPushButton是更特别比QAbstractButton。尽管如此,对于风格计算,所有的类型选择器有相同的特性,最后一个出现的规则有优先权。换句话说,颜色被设置成gray对于所有的QAbstractButton,包括QPushButton。如果我们真的想要QPushButton有红色text,我们能够重新设置规则。
为了决定一个规则的特性,Qt Style Sheets效仿CSS2 Specification
一个选择器的特性被计算像下面:
ID属性数在选择器中。=a
数其他属性和虚假类的数目在选择器中。=b
数元素名字的数目在选择器中。=c
忽略虚假属性
连接三个数目a-b-c(在一个数目系统带着一个大的基数)给出特性。
*             {}  /* a=0 b=0 c=0 -> specificity =   0 */
 LI            {}  /* a=0 b=0 c=1 -> specificity =   1 */
 UL LI         {}  /* a=0 b=0 c=2 -> specificity =   2 */
 UL OL+LI      {}  /* a=0 b=0 c=3 -> specificity =   3 */
 H1 + *[REL=up]{}  /* a=0 b=1 c=1 -> specificity =  11 */
 UL OL LI.red  {}  /* a=0 b=1 c=3 -> specificity =  13 */
 LI.red.level  {}  /* a=0 b=2 c=1 -> specificity =  21 */
 #x34y         {}  /* a=1 b=0 c=0 -> specificity = 100 */
级联:
Style sheet 能被设置在QApplication,在父窗口,在孩子窗口。一个随意的widget的有效地style sheet是被包含通过合并设置在widget的祖先的style sheet,也任何被设置在QApplication上的style sheet
当冲突产生,widget的自己的style sheet总是跟喜欢任何继承的style sheet,不同于冲突的规则的特性。否则,父窗口的style sheet更喜欢祖父的。
这样的一个结果是设置一个style 规则在一个widget自动的,给他优先权盖过其他的规则在祖先widgetstyle sheet或者QApplication style sheet。考虑下面的例子,
qApp->setStyleSheet("QPushButton { color: white }"); myPushButton->setStyleSheet("* { color: blue }");
它等同于:
myPushButton->setStyleSheet("color: blue");
如果QPushButton有孩子。Style sheet将对他们没有影响。Style sheet级联是一个复杂的主题。参考CSS2 Specification为站点类别详情。知道qt目前不执行!important
继承:
在经典的CSS,当一个item的字体和颜色不是确切被设置,它自动继承从父类。当使用qt style sheet,一个widget不自动继承他的字体和颜色设置佛纳甘他的父窗口。
qApp->setStyleSheet("QGroupBox { color: red; } ");
QPushButton没有一个明确的颜色设置。因此,代替继承他的父类颜色QGroupBox,他有系统颜色。如果我们想颜色在一个QGroupBox和他的孩子,我们能写:
qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");
相比之下,设置一个字体和繁衍,使用QWidget::setFont()QWidget::setPalette()繁衍来孩子widget
Widgetsc++命名空间内
类型选择器能被用来风格化widgets
class MyPushButton : public QPushButton {
     // ...
 }
 
 // ...
 qApp->setStyleSheet("MyPushButton { background: yellow; }");
Qt style sheet使用QObject::className()来决定何时应用类型选择器。当定制widget是在命名空间内,QObject::className()返回<namespace>::<classname>.这和微调语句冲突。为了克服这个问题,当使用类型选择器为命名空间内的widget,我们必须替代“::”使用“--
namespace ns {
     class MyPushButton : public QPushButton {
         // ...
     }
 }
 
 // ...
 qApp->setSytleSheet("ns--MyPushButton { background: yellow; }");
设置对象属性:
qt4.3和以上的版本,任何能设计的Q_PROPERTY能被设置使用qproperty-<property name>语句。
MyLabel { qproperty-pixmap: url(pixmap.png); }
 MyGroupBox { qproperty-titleColor: rgb(100, 200, 100); }
 QPushButton { qproperty-iconSize: 20px 20px; }
如果属性参考一个enum类型Q_ENUMS,你能参考他的常量通过名字,不是他们的数字值。