//这个实在是难翻译,很多地方直译,因为我也没看懂
细微控制:
为了风格化复杂的widget,那是必须的进行widget的细微控制。例如一个QComboBox的drop-down按钮,或者一个QSpinBox的上下线。选择器可能包含细微控制,使限制一个规则的应用来说明widget细微控制。例如:
QComboBox::drop-down { p_w_picpath: url(dropdown.png) }
上面的规则风格化所有的QComboBox的上下按钮。尽管双冒号::语句像CSS3的Pseudo-Elements。Qt的细微控制不同于这些,有不同的级联语义。
细微控制总是定位根据另一个元素--—一个参考元素。这个参考元素能是widget或者另一个细微控制。例如,一个QComboBox的::drop-down被定位,缺省的,在QComboBox衬底矩形的右上角。::drop-down被定位,缺省的,在::drop-down微调内容矩形的中心。看
起点能被改变通过使用subcontrol-origin。例如,如果我们想定位drop-down在QComboBox空白处代替缺省的衬底部分,我们能这样:
QComboBox {
margin-right: 20px;
}
QComboBox::drop-down {
subcontrol-origin: margin;
}
drop-down的对齐在空白矩形范围可以通过subcontrol-position改变。宽度和高度属性能被用来控制微调的大小。注意设置一个图片潜在的设置了微调的大小。
相对位置的设置方法(position:relative),允许微调的位置抵消他的原来的位置。例如,当QComboBox的drop-down按钮被按下,我们可能想要一种被按下的效果。如下:
QComboBox::down-arrow {
p_w_picpath: url(down_arrow.png);
}
QComboBox::down-arrow:pressed {
position: relative;
top: 1px; left: 1px;
}
绝对位置的设置方法(position:absolute),允许微调的位置和大小被改变与参考元素相关。一旦定位,他们被对待和widget一样,能被风格化通过使用box model。看 List of Sub-Controls为支持的微调。
注意:对于复杂的widget例如QComboBox和QScrollBar,如果一个属性或者微调被定制,所有其他的属性或者微调必须也被定制。
虚假状态:
选择器可能包含虚假状态,指出限制那些基于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自动的,给他优先权盖过其他的规则在祖先widget的style 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。
Widgets在c++命名空间内
类型选择器能被用来风格化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,你能参考他的常量通过名字,不是他们的数字值。