`
美丽的小岛
  • 浏览: 310687 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

QT之QSS基础【转】

    博客分类:
  • QT
 
阅读更多

同css 相似,qss的主要功能与最终目的都是能使界面的表现与界面的元素分离,即质与形的分离,就如同一个人可以在不同的时候穿上不同的衣服一样。

 

QT 皮肤 QSS编程是本文要介绍的内容,借用css 的灵感,Qt也支持Qt自己的css,简称qss。同css 相似,qss的主要功能与最终目的都是能使界面的表现与界面的元素分离,即质与形的分离,就如同一个人可以在不同的时候穿上不同的衣服一样,css机制的引入,使得设计一种皮肤与界面控件分离的软件成为可能,应用程序也能像web界面那样随意地改变外观。

一、QSS语法

同css一样,他也有由一个selector与一个declaration组成,selector指定了是对哪一个控件产生效果,而declaration才是真正的产生作用的语句。如:

  1. QPushButton { color: red } 

QPushButton指定了是对所有的QPushButton或是其子类控件(如用户定义的MyPushButton)产生影响,而color:red表明所有的受影响控件的前景色都为red。

除了“类名”,“对象名”,“Qt属性名”这三样东西是大小写敏感的外其他的东西都是大小写不敏感的,如color与Color代表同一属性。

如果有几个selector指定了相同的declaration,可以使用逗号(,)将各个选择器分开,如:

  1. QPushButton, QLineEdit, QComboBox{ color: red } 

他相当于:

  1. QPushButton { color: red }  
  2. QLineEdit { color: red }  
  3. QComboBox{ color: red } 

declaration部份是一系列的(属性:值)对,使用分号(;)将各个不同的属性值对分开,使用大括号({})将所有declaration包含在一起。

1、一般选择器(selector)

Qt支持所有的CSS2定义的选择器,其祥细内容可以在w3c的网站上查找 http://www.w3.org/TR/CSS2/selector.html ,其中比较常用的selector类型有:

通用类型选择器:*会对所有控件有效果。

类型选择器:QPushButton匹配所有QPushButton的实例和其子类的实例。

属性选择器:QPushButton[flat=”false”]匹配所有QPushButton属性flat为false的实例,属性分为两种,静态的和动态的,静态属性可以通过Q_PROPERTY()来指定,来动态属性可以使用setProperty来指定,如:

  1. QLineEdit *nameEdit = new QLineEdit(this);  
  2. nameEdit->setProperty("mandatoryField", true); 

如果在设置了qss后Qt属性改变了,需要重新设置qss来使其生效,可以使用先unset再set qss。

类选择器:.QPushButton匹配所有QPushButton的实例,但不包含其子类,这相当于:*[class~="QPushButton"]     ~=的意思是测试一个QStringList类型的属性是否包含给定的QString

ID选择器:QPushButton#okButton对应Qt里面的object name设置,使用这条CSS之前要先设置对应控件的object name为okButton,如:Ok->setObjectName(tr(“okButton”));

后裔选择器:QDialog QPushButton匹配所有为QDialog后裔(包含儿子,与儿子的儿子的递归)为QPushButton的实例

子选择器:QDialog > QPushButton匹配所有的QDialog直接子类QPushButton的实例,不包含儿子的儿子的递归。

2、子控件选择器

对于复杂的控件,可能会在其中包含其他子控件,如一个QComboxBox中有一个drop-down的按钮。那么现在如果要设置QComboxBox的下拉按钮的话,就可以这样访问:

QComboBox::drop-down { image: url(dropdown.png)}其标志是(::)

子控件选择器是用位置的引用来代表一个元素,这个元素可以是一个单一控件或是另一个包含子控件的复合控件。使用subcontrol-origin属性可以改变子控件的默认放置位置,如:

  1. QComboBox{  
  2.        margin-right: 20px;  
  3. }  
  4. QComboBox::drop-down {  
  5.        subcontrol-origin: margin;  
  6. }  

如上语句可以用来改变drop-down的margin。

相对位置属性可以用来改变子控件相对于最初位置的偏移量,如当一个QCombox的drop-down按钮被按下时,我们可以用一个内部的小偏移量来表示被按下的效果,如下:

  1. QComboBox::down-arrow{  
  2.        image: url(down_arrow.png);  
  3. }  
  4. QComboBox::down-arrow:pressed {  
  5.        position: relative;  
  6.        top: 1px; left: 1px;  
  7. }  

绝对位置属性允许子控件改变自己的位置和大小而不受引用元素的控件。一但位置被设定了,这些子控件就可以被当成一般的widget来对待,并且可以使用合模型。关于合模型可以参考下面。
 
如果你要查看Qt支持哪些子控件选择器,可以参考:http://pepper.troll.no/s60prereleases/doc/stylesheet-reference.html#list-of-sub-controls-syntax.html

 

3、伪选择器(pseudo-states)

伪选择器以冒号(:)表示,与css里的伪选择器相似,是基于控件的一些基本状态来限定程序的规则,如hover规则表示鼠标经过控件时的状态,而press表示按下按钮时的状态。如:

  1. QPushButton:hover {  
  2.        Background-color:red;  

表示鼠标经过时QPushButton背景变红。

Pseudo还支持否定符号(!),如:

  1. QRadioButton:!hover { color: red } 

表示没有鼠标移上QRadioButton时他显示的颜色是red。

Pseudo可以被串连在一起,比如:

  1. QPushButton:hover:!pressed { color: blue; } 

表示QPushButton在鼠标移上却没有点击时显示blue字,但如果点击的时候就不会显示blue颜色了。

同样可以和之前所讲的子控件选择器一起联合使用,如:

  1. QSpinBox::down-button:hover { image: url(btn-combobox-press.bmp)}  

与前面所讲的一样,伪选择器,子控件选择器等都是可以用逗号(,)分隔表示连续相同的设置的,如:

QPushButton:hover,QSpinBox::down-button, QCheckBox:checked { color: white ;image: url(btn-combobox-press.bmp);}表示如下

更多请参考:http://pepper.troll.no/s60prereleases/doc/stylesheet-reference.html#list-of-pseudo-states

二、解决冲突

使用object name

在程序里面要先设置控件的,如:

  1. btnOne = new QPushButton(centralWidget);  
  2. btnOne->setObjectName(QString::fromUtf8("btnOneCh"));  

这样,我们有了一个object name为btnOneCh的QPushButton,试验一下,使用指定object name的方式,如:

  1. QPushButton#btnOneCh { color: red }  
  2. QPushButton { color: white } 

可以看出,btnOncCh的color变成了red

使用伪选择器,如hover,press,enabled等,如:按扭“1”是disable了的,QPushButton:!enabled {color: white}

所有的类型选择器都有一个共同的特性,就是如果有两个属性冲突了的话就会以最后出现的一个为准,如:

  1. QPushButton { color: red }  
  2. QAbstractButton { color: gray} 

由于QPushButton为QAbstractButton的子类,如果只设置QAbstractButton的可以想像结果是所有的QPushButton都为gray,如果只设置QPushButton的所有QPushButton都会为red,当两个都能设置起效的时候,以在文本上最后出现的为准,所以结果为Grey

当然其中如果有#指定了object name,他所设置的优先级是最大的,具体规则可以参考:http://www.w3.org/TR/CSS2/cascade.html#specificity,

或是http://pepper.troll.no/s60prereleases/doc/stylesheet-syntax.html#conflict-resolution

  1. QPushButton#btnOneCh { color: red }  
  2. QPushButton { color: blue }  
  3. QAbstractButton { color: gray} 

虽然QAbstractButton在最后,但是之前有#btnOneCh指定了QPushButton“一”的color为red所以最后显示也是“一”为red。

 

三、级联效应

子类可以继承父类的StyleSheet,但是如果子类里面设置了StyleSheet与父类里在设置的有冲突,那么当然会优先考虑子类自己的,

同样,如果在qApp时面设置了,但是在某一个特定控件里面也设置,如果有冲突,也是优先控件自己的,例如,我在程序时面设置了:btnOneEn->setStyleSheet("QPushButton { color: red }");

而,当我再设置qApp时,如果,将QPushButton的color设置成grey的,那么结果是对于btnOneEn这个QPushButton来说他的颜色还是red。

这就是为什么这里设置为grey了btnOneEn却还是red的。

如果我们对一个控件设置StyleSheet为:

  1. QPushButton* myPushButton;  
  2. myPushButton->setStyleSheet("*{ color: blue }"); 

其实他和设置为:myPushButton->setStyleSheet("color: blue");

效果相同,只是后一种设置不会对QPushButton的子类产生作用,但第一种却会。

四、继承性

与CSS不同的一点,在CSS box模型中,如果一个元素在别一元素的里面,那么里面的元素会自动继承外面元素的属性,但QSS里面不会,如:

一个QPushButton如果放在一个QGroupBox里面,如果:qApp->setStyleSheet("QGroupBox{ color: red; }");

并不代表在QGroupBox里面的QPushButton也会有color:red的属性,如果要想有的话要显示写明,如:qApp->setStyleSheet("QGroupBox, QGroupBox*{ color: red; }");

或者在应用程序里面也可以用QWidget::setFont等来设置到子控件的属性。

五、Namespace冲突

类型选择器能够使用到一个特定的类型,如:

  1. class MyPushButton : public QPushButton {  
  2.       //...  
  3. }  
  4. qApp->setStyleSheet("MyPushButton { background: yellow; }"); 

因为QSS使用QObject::className来判断要赋与style sheet的控件类型,如果一个用户定义控件类型在一个namespace里面的话,QObject::className会返回<namespace>::<classname> 的名字,这和子控件选择器的语法相冲突,为了解决此问题,使用“--”来代替“::”,比如:

  1. namespace ns {  
  2.       class MyPushButton : public QPushButton {  
  3.           //...  
  4.       }  
  5. }  
  6. qApp->setSytleSheet("ns--MyPushButton { background: yellow; }"); 

六、设置对像属性

如果在程序里面使用Q_PROPERTY设置的属性,可以在qss里面使用:qproperty-<property name>的形式来访问并设置值。如:

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

如果属性引用到的是一个由Q_ENUMS申明的enum 时,要引用其属性名字要用定义的名称而不是数字。

小结:详解 QT 皮肤QSS编程的内容介绍完了,希望本篇文章对你有所帮助。

分享到:
评论

相关推荐

    QT实现QSS自动换肤

    一、QSS基础 1. **定义样式**: QSS使用类似于CSS的语法,可以设置控件的颜色、字体、边框、背景等样式属性。例如,为一个按钮设置红色背景和白色文字: ```css QPushButton { background-color: red; color: ...

    QSS.rar_QSS样式表_QT QSS_QT 样式_Qt样式表_qss

    1. **QSS基础概念**: - **QSS语法**:QSS的语法与CSS类似,包括选择器(Selectors)、属性(Properties)和值(Values)。选择器用于指定要应用样式的对象,属性定义对象的视觉特性,如颜色、字体、大小等,而值则...

    好用的QT-qss漂亮界面

    QT框架中的QSS(Qt StyleSheet)是用于给Qt应用程序添加样式和皮肤的一种强大工具,它类似于网页设计中的CSS,能够使你的应用界面看起来更加专业和美观。本资源提供了"好用的QT-qss漂亮界面",包含代码示例和相关的...

    Qt界面QSS等

    【Qt界面QSS等】是关于使用Qt框架创建和美化用户界面的主题,特别是涉及到QSS(Qt Style Sheets)的应用。QSS类似于Web开发中的CSS,它允许开发者通过样式表来控制Qt应用程序的外观和感觉,实现类似网页设计的灵活性...

    Qt-样式表qss练习

    在Qt框架中,QSS(Qt Style Sheets)是一种强大的样式表语言,用于定制应用程序的界面外观,类似于网页设计中的CSS。QSS允许开发者通过简单的文本文件或者代码动态地改变控件的颜色、字体、布局以及整体视觉效果,为...

    Qt Qss/Css 使用

    QSS允许开发者通过使用类似CSS的语法来控制Qt应用的外观,包括控件的颜色、字体、边框、背景、间距等,极大地提高了应用的可定制性和美观性。以下是对"Qt Qss/Css 使用"这一主题的详细讲解: 一、QSS的基本概念与...

    qt qss编写工具

    Qt QSS编写工具是一款专为Qt开发者设计的实用软件,旨在简化QSS(Qt StyleSheet)的编写过程,并提供实时预览功能。QSS是Qt框架中用于定制界面样式的一种语言,类似于网页开发中的CSS,通过定义样式规则来改变Qt应用...

    QT漂亮QSS样式模仿流行VUE Element UI 表单 QSS快速入门 QSS无基础快速开发实战例子 QSS漂亮下料

    QT漂亮QSS样式模仿流行VUE Element UI 表单,QSS漂亮大方美观表单样式 QSS表单样式 QLineEditQComboBox QCheckBox漂亮样式QSS 快速开发QSS漂亮界面 Element UI的设计魅力 Element UI的魅力在于其清晰的布局、统一的...

    QT 7种QSS效果

    以上7种QSS效果是QT界面设计中常用且基础的部分,熟练掌握它们能够极大地提升UI的美观度和用户体验。通过QSS,开发者不仅可以定制化控件的颜色、形状,还能实现复杂的动画效果,使QT应用的界面设计具有无限可能。在...

    好看的Qt QSS样式 好看的Qt QSS样式

    Qt QSS,全称为Qt Style Sheets,是Qt框架中...通过以上内容,你可以掌握Qt QSS的基础知识,并逐步提升界面设计的美观度和专业性。在实践中不断尝试和优化,你的Qt应用将会拥有独特的视觉风格,提升用户的操作体验。

    QT漂亮QSS样式模仿流行VUE Element UI之按钮 实战例子 快速入门QSS开发

    QSS作为Qt平台的样式表语言,虽然在语法上大量借鉴了CSS 2,但并非与之完全等价。尽管如此,QSS仍然支持了大部分CSS 2的关键特性,包括但不限于颜色、背景、边框、文本样式、布局属性等,这为模仿Element UI风格提供...

    QT开发经验(含QML、QT、QSS样式)

    在学习QT开发的过程中,可以参考《Qt学习之路》这样的书籍,它通常会涵盖从基础到进阶的全方位教程,包括Qt的安装配置、基本组件的使用、信号与槽机制、网络编程等内容。而《QML Book In Chinese》和《Qt样式表葵花...

    qss样式表模板,包括了17种样式表。

    1. **QSS基础概念** QSS是一种基于CSS的样式语言,用于Qt应用程序的UI设计。它允许通过定义颜色、字体、边框、背景、阴影等属性来改变控件的外观。QSS支持类选择器、ID选择器、伪类选择器等,可以精细控制不同类型...

    QSS样式表之黑色风格.rar

    1. **QSS基础** QSS允许设置颜色、字体、边框、背景、阴影等属性,可以自定义按钮、文本框、菜单等控件的样式。基本语法与CSS类似,通过选择器(如`QPushButton`)选定特定控件,然后定义相应的样式规则。 2. **...

    qss.rar_qss_qssFile_qss文件_qss皮肤_qt4 蓝色qss

    QSS(Qt Style Sheets)是Qt框架中的一种样式表语言,类似于Web开发中的CSS,用于定义Qt应用程序的界面样式和布局。它允许开发者通过简单的文本文件来改变窗口、控件和对话框的外观,实现丰富的视觉效果。"qss.rar_...

    QT样式美化 之 qss入门

    #### 二、QSS基础语法 QSS的基本结构与CSS相似,由选择器(Selector)和声明(Declaration)两部分组成: - **选择器(Selector)**:指定了QSS规则应用于哪些控件。 - **声明(Declaration)**:定义了控件的具体...

    QSS样式表入门练习Demo.pdf

    ### 1、QSS基础 QSS类似于HTML中的CSS,允许开发者使用类似于CSS的语法来定义Qt控件的样式。通过QSS,你可以改变控件的颜色、字体、边框、背景等视觉属性,创建出独特的用户界面设计。 ### 2、Qt控件样式 #### ...

    Qt样式表qss的两种实现方法

    Qt样式表(QSS,Qt Style Sheets)是Qt框架中用于自定义用户界面外观的一种机制,类似于网页设计中的CSS。通过QSS,开发者可以轻松地改变控件的颜色、字体、边框、背景图像等,使得应用程序具有丰富的视觉效果。本文...

    QT 黑色风格+白色风格+淡蓝色风格样式表

    在QT中,样式表(QSS,Qt Style Sheets)类似于网页开发中的CSS(层叠样式表),用于控制Qt界面元素的外观。QSS允许开发者以一种声明式的方式定义窗口、按钮、文本框等各种控件的样式,包括颜色、字体、边框、阴影、...

    QT QSS样式工具:qtbox

    QT QSS样式工具:qtbox 是一款专为Qt应用程序设计的QSS(Qt Style Sheets)样式编辑和预览工具。QSS类似于Web开发中的CSS,它允许开发者通过类似CSS的语法来定制Qt界面的外观和感觉,使得Qt应用的界面设计更加灵活、...

Global site tag (gtag.js) - Google Analytics