Qt样式表(1):Qt样式表基础

Qt样式表(1):Qt样式表基础

本文为原创文章,转载请注明出处,或注明转载自“黄邦勇帅(原名:黄勇)

本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址:
https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q
《C++语法详解》网盘地址:https://pan.baidu.com/s/1dIxLMN5b91zpJN2sZv1MNg

若对C++语法不熟悉,建议参阅本人所著《C++语法详解》一书,电子工业出版社出版,该书语法示例短小精悍,对查阅C++知识点相当方便,并对语法原理进行了透彻、深入详细的讲解,可确保读者彻底弄懂C++的原理,彻底解惑C++,使其知其然更知其所以然。此书是一本全面了解C++不可多得的案头必备图书。

Qt样式表是另外一种自定义部件外观的机制。Qt样式表的术语、语法几乎与层叠样式表CSS(Cascading Style Sheets)相同,若已熟悉CSS,则可快速阅读本小节及其之后的内容。
使用样式表与调色板(QPalette)相比,样式表更强大,因为使用调色板设置的外观,并不能保证在所有的样式中都可正常的工作,但样式表就不受这样的限制。而且使用样式表可以更方便的设置界面的外观,而不用去子类化QStyle类
注意:子类化QStyle类的样式目前不支持样式表。这个问题将在以后解决。
可使用QApplication::setStyleSheet()函数设置整个应用程序的样式表,使用QWidget::setStyleSheet()设置部件及其子部件的样式表,这两个函数的原型如下:
在这里插入图片描述

示例13.10:样式表的简单使用(效果见图13-24)
#include<QtWidgets>
int main(int argc, char *argv[]){
    QApplication aa(argc,argv);
    QWidget w;
    QPushButton *pb1=new QPushButton("AAA",&w); 	pb1->move(22,22);
    QPushButton *pb2=new QPushButton("BBB",&w); 	pb2->move(99,22);
    QCheckBox *pc=new QCheckBox("CCC",&w); 		pc->move(22,55);
QCheckBox *pc1=new QCheckBox("DDD",&w); 		pc1->move(99,55);
	//设置复选按钮pc1的背景色为黄色,复选按钮pc不受影响,注意:函数中的字符串为样式表的语法
    pc1->setStyleSheet("background-color:rgb(111,111,1)");
	//设置整个应用程序的按钮的背景色都为红色
    aa.setStyleSheet("QPushButton{background-color:red}");
    w.resize(444,333);    w.show();    return aa.exec();  }

在这里插入图片描述

13.8.2 样式表语法基础
Qt样式表通常不区分大小写,除了类名、对象名和Qt属性名称之外。
样式表基本语法规则如下
①、样式表由选择器(selector)和声明(declaration)两部分组成,选择器指定了受影响的部件,声明指定了要设置的属性(注意与Qt属性的区别)。比如

QPushButton { color : blue}

其中QPushButton是选择器,{color: blue}是声明,color是需要设置的属性,blue是属性的值。以上语句表明,QPushButton及其子类应使用blue(蓝色)作为其前景色。
②、可为相同的声明指定多个选择器,选择器之间使用逗号“,”进行分隔,比如

QPushButton, QCheckBox, QLineEdit{color: red}
与以下3条语句相同
QPushButton{color: red}    QCheckBox,{color: red}    QLineEdit{color: red}

③、指定多个属性时使用分号分隔,比如

QPushButton{color: red; background-color:blue}   //按钮前景色为红色,背景色为蓝色

④、为含有多个值的属性指定多个值时使用空隔分隔,比如

QLineEdit{border: 2px solid red}   //表示边框线为2像素宽的实现,其颜色为红色
      以上语句的属性border是一种对属性的简写方法,以上语句相当于以下3条语句:
      		QLineEdit{ border-width: 2px; 
			border-style:solid; 
		 	border-color:red }

⑤、若直接在部件上设置样式表,可忽略选择器及大括号,比如

QPushButton *pb1=new QPushButton ("BBB",&w);
 			//设置按钮的背景色,省略了选择器(即QPushButton)和大括号
   			pb1->setStyleSheet("background-color:yellow"); 

13.8.3 选择器

表13-23为样式表的选择器
在这里插入图片描述

示例13.11:样式表选择器
QApplication aa(argc,argv);
QWidget w; 
QPushButton *pb1=new QPushButton("AAA",&w);	pb1->move(22,22); pb1->resize(111,33);
QPushButton *pb2=new QPushButton("BBB",&w); 	pb2->move(199,22);
w.setObjectName("www");   pb1->setObjectName("AAA");   //设置对象名
/*以下语句将把按钮AAA的背景色设置为红色,表示把对象名为www的QWidget的直接子部件QPushButton的背景色设置为红色,其中QPushButton的对象名为AAA,其x属性和y属性(即QPushButton的位置)的值都为22*/
aa.setStyleSheet("QWidget#www > QPushButton#AAA[x=\"22\"][y=\"22\"]{background-color:red}");

示例13.12:动态属性的使用
QApplication aa(argc,argv);
    QWidget w;
    QPushButton *pb1=new QPushButton("AAA",&w);    pb1->move(22,22); pb1->resize(111,33);
    QPushButton *pb2=new QPushButton("BBB",&w); 	pb2->move(199,22);
    QCheckBox *pc=new QCheckBox("CCC",&w); 		pc->move(22,55);
    QCheckBox *pc1=new QCheckBox("DDD",&w); 		pc1->move(99,55);
pb1->setProperty("XXX",true);    				pc1->setProperty("XXX",true); 	//设置动态属性
//以下语句将把按钮pb1和pc1的背景色设置为红色,以下语句表示匹配所有属性"XXX = true"的部件
    aa.setStyleSheet("*[XXX=true]{background-color:red}");

13.8.4 子控件

复杂控件通常包含一系列子控件,比如QComboBox的下拉按钮就是子控件,还有QSpinBox的向上/向下箭头等。对复杂控件使用样式表设置外观可能需要访问其子控件。样子表中子控件以“::”符号开头。表13-24为样式表的子控件
在这里插入图片描述
在这里插入图片描述

13.8.5 伪状态

部件含有一系列的状态,样式表的状态使用“:”符号开头。比如

QPushButton:hover{…}    //表示鼠标悬停在按钮上

伪状态(见表13-25)的规则如下:
①、用感叹号可否定伪状态,比如

QPushButton:!hover{…}    //表示鼠标未悬停在按钮上

②、多个伪状态连用可达到逻辑与(AND)的效果,比如

QCheckBox:hover:checked{…}    //表示鼠标悬停在按钮上且被选中

③、多个伪状态之间使用逗号分隔可表示逻辑或(OR)的效果,比如

QCheckBox:hover, QCheckBox:checked{…} //表示鼠标悬停在按钮上或被选中,注意语法的写法

④、伪状态还可与子控件联合使用,比如

QComboBox::drop-down:hover{…}

在这里插入图片描述
在这里插入图片描述

13.9、样式表的属性

注:类型为属性可取值的“属性类型”(注意:不是Qt类型,属性类型及可取值见13.9.6节)
本小节把border也翻译为边框,因此需注意与frame(边框)的区别,可把border译为边界

13.9.1 与背景色、前景色、所选文本颜色相关的属性(见表13-26)
在这里插入图片描述
在这里插入图片描述

示例13.13:使用样式表设置部件的背景色(效果见图13-25)
#include<QtWidgets>
int main(int argc, char *argv[]){    QApplication aa(argc,argv);
    		QWidget w;
   		aa.setStyleSheet(
		//背景色为红色,背景图片为1i.png。注意为属性指定多个值的方法
      	"QWidget{background: red url(F:/1i.png);"  
      	"background-repeat: repeat-y;"        	//在y轴方向重复图片
      	"background-position: right;}");      	//图片位于部件右侧
    		w.resize(300,200);    w.show();    return aa.exec();		}

在这里插入图片描述

13.9.2 盒子模型原理及相关属性(见下一篇文章)

本文作者:黄邦勇帅(原名:黄勇)

在这里插入图片描述

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值