您的位置:首页 > Web前端 > CSS

Qt Style Sheet(二)----类似css

2015-09-01 16:52 686 查看
//这个实在是难翻译,很多地方直译,因为我也没看懂

细微控制:
为了风格化复杂的widget,那是必须的进行widget的细微控制。例如一个QComboBox的drop-down按钮,或者一个QSpinBox的上下线。选择器可能包含细微控制,使限制一个规则的应用来说明widget细微控制。例如:

QComboBox::drop-down{image:url(dropdown.png)}


上面的规则风格化所有的QComboBox的上下按钮。尽管双冒号::语句像CSS3的Pseudo-Elements。Qt的细微控制不同于这些,有不同的级联语义。
细微控制总是定位根据另一个元素--—一个参考元素。这个参考元素能是widget或者另一个细微控制。例如,一个QComboBox的::drop-down被定位,缺省的,在QComboBox衬底矩形的右上角。::drop-down被定位,缺省的,在::drop-down微调内容矩形的中心。看
ListofStylableWidgets来风格化一个widget和他们缺省的位置。
起点能被改变通过使用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{

image:url(down_arrow.png);

}

QComboBox::down-arrow:pressed{

position:relative;

top:1px;left:1px;

}


绝对位置的设置方法(position:absolute),允许微调的位置和大小被改变与参考元素相关。一旦定位,他们被对待和widget一样,能被风格化通过使用boxmodel。看ListofSub-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{image: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,我们能够重新设置规则。
为了决定一个规则的特性,QtStyleSheets效仿CSS2Specification。
一个选择器的特性被计算像下面:
数ID属性数在选择器中。=a
数其他属性和虚假类的数目在选择器中。=b
数元素名字的数目在选择器中。=c
忽略虚假属性
连接三个数目a-b-c(在一个数目系统带着一个大的基数)给出特性。

*{}/*a=0b=0c=0->specificity=0*/

LI{}/*a=0b=0c=1->specificity=1*/

ULLI{}/*a=0b=0c=2->specificity=2*/

ULOL+LI{}/*a=0b=0c=3->specificity=3*/

H1+*[REL=up]{}/*a=0b=1c=1->specificity=11*/

ULOLLI.red{}/*a=0b=1c=3->specificity=13*/

LI.red.level{}/*a=0b=2c=1->specificity=21*/

#x34y{}/*a=1b=0c=0->specificity=100*/


级联:
Stylesheet能被设置在QApplication,在父窗口,在孩子窗口。一个随意的widget的有效地stylesheet是被包含通过合并设置在widget的祖先的stylesheet,也任何被设置在QApplication上的stylesheet。
当冲突产生,widget的自己的stylesheet总是跟喜欢任何继承的stylesheet,不同于冲突的规则的特性。否则,父窗口的stylesheet更喜欢祖父的。
这样的一个结果是设置一个style规则在一个widget自动的,给他优先权盖过其他的规则在祖先widget的stylesheet或者QApplicationstylesheet。考虑下面的例子,

qApp->setStyleSheet("QPushButton{color:white}");myPushButton->setStyleSheet("*{color:blue}");

它等同于:

myPushButton->setStyleSheet("color:blue");

如果QPushButton有孩子。Stylesheet将对他们没有影响。Stylesheet级联是一个复杂的主题。参考CSS2Specification为站点类别详情。知道qt目前不执行!important

继承:

在经典的CSS,当一个item的字体和颜色不是确切被设置,它自动继承从父类。当使用qtstylesheet,一个widget不自动继承他的字体和颜色设置佛纳甘他的父窗口。

qApp->setStyleSheet("QGroupBox{color:red;}");

QPushButton没有一个明确的颜色设置。因此,代替继承他的父类颜色QGroupBox,他有系统颜色。如果我们想颜色在一个QGroupBox和他的孩子,我们能写:

qApp->setStyleSheet("QGroupBox,QGroupBox*{color:red;}");

相比之下,设置一个字体和繁衍,使用QWidget::setFont()和QWidget::setPalette()繁衍来孩子widget。

Widgets在c++命名空间内

类型选择器能被用来风格化widgets。

classMyPushButton:publicQPushButton{

//...

}


//...

qApp->setStyleSheet("MyPushButton{background:yellow;}");

Qtstylesheet使用QObject::className()来决定何时应用类型选择器。当定制widget是在命名空间内,QObject::className()返回<namespace>::<classname>.这和微调语句冲突。为了克服这个问题,当使用类型选择器为命名空间内的widget,我们必须替代“::”使用“--”

namespacens{

classMyPushButton:publicQPushButton{

//...

}

}


//...

qApp->setSytleSheet("ns--MyPushButton{background:yellow;}");


设置对象属性:
从qt4.3和以上的版本,任何能设计的Q_PROPERTY能被设置使用qproperty-<propertyname>语句。

MyLabel{qproperty-pixmap:url(pixmap.png);}

MyGroupBox{qproperty-titleColor:rgb(100,200,100);}

QPushButton{qproperty-iconSize:20px20px;}


如果属性参考一个enum类型Q_ENUMS,你能参考他的常量通过名字,不是他们的数字值。

转自:http://no001.blog.51cto.com/1142339/281736
http://blog.csdn.net/liuqz2009/article/details/6978091
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: