Qt 样式表

来源:互联网 发布:淘宝搜店铺怎么搜不到 编辑:程序博客网 时间:2024/05/16 14:12

在Qt中设置widget背景颜色或者图片方法很多种:重写paintEvent() , 调色板QPalette , 样式表setStyleSheet等等。 

setStyleSheet()

pWidget->setStyleSheet("background-color:blue;"); //设置背景颜色

pWidget->setStyleSheet("background-color:rgb(199,237,204)");  

pWidget->setStyleSheet("background-image:url(:/folder/show.bmp);"); //设置背景图片

优点是简单方便

缺点是

(1)父窗口用setStyleSheet()设置后子窗口一定会受到影响,除非子窗口也用setStyleSheet(),这样会让子窗口的设置变得局限。即便用两个Form Class来分别做大小窗口,然后在大窗口的Form Class中show()调用小窗口,小窗口依然会受影响

        (2)用setStyleSheet()加载的图片是无法缩放的,如果其大小与widget窗口大小不相符,则我们无法用程序来实现图片的缩放,除非我们直接处理图片使其大小与widget窗口相符

 

父窗口适合使用的设置方法:

pWidget->setAutoFillBackground(true);

QPalette palette;
QPixmap pixmap(":/folder/show.bmp");
palette.setBrush(pWidget->backgroundRole(),QBrush(pixmap));
pWidget->setPalette(palette);


式表规则的范围和优先级关系

因为样式表规则的层级关系比较复杂,另外设置的方式也有很多,有时候会发生多条规则都和某一个具体控件相关的情况,这样具体哪一条样式表规则最终被应用到控件的UI表现上,就需要有一个规则来定义,大致上牵涉到这个问题的情况有如下几种

 

规则冲突

多条规则制定了不同的内容,可能的情况有很多,比如

QPushButton:hover { color: white }
QPushButton { color: red }

这种情况,其实可以不算冲突,更加具体的类型描述符定义的规则拥有更高优先级,所以一个有鼠标悬停的按钮的文本颜色就是白色的,否则为红色

QPushButton:hover { color: white }
QPushButton:enabled { color: red }

这里就可能发生规则冲突,当一个使能的按钮有鼠标悬停的时候,颜色的定义是什么呢? QStyleSheet的判断原则是,后面规则的优先级高于前面的规则,所以这种情况颜色为红色

QPushButton { color: red }
QAbstractButton { color: gray }

这个相对难发现,一个基类及其子类都定义了针对文本颜色的规则,那么子类应用哪一条规则呢?你可能会认为自然是子类用自己的规则了,很可惜不是,样式表不考虑类的继承层级优先关系,所以还是后一条规则优先级高于前一条规则。如果确实要单独设定子类的规则,需要交换规则的顺序。

 

样式表层叠 Cascading

因为样式表可以应用在QApplication上,也可以单独应用在控件上,所以最终应用到一个具体控件的样式表,是通过叠加合并所有的父控件乃至应用程序的样式表设定来得到的。这种情况下,也有可能发生规则冲突, 例如:

 [cpp]

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

这种情况下,控件自身的样式表的优先级高于父控件或应用程序的样式表

 

样式表继承 Inheritance

在标准的CSS样式表中,一个控件的字体和颜色属性如果没有明确设定,那么将自动继承自父控件,而在QT的样式表中,不会自动继承,例如:
qApp->setStyleSheet("QGroupBox { color: red; } ");

这种情况下,对于GroupBox中的添加的子控件,不会自动设置其颜色属性,如果要设置子控件的属性,需要明确设定:
qApp->setStyleSheet("QGroupBox, QGroupBox * { color: red; }");

注意,这里的继承和上面的层叠不一样,层叠指不同样式表设置同一个对象,继承指的则是样式表规则中选择器对控件层级关系的影响

 

Stylesheet是如何附加在Style上的

当设置StyleSheet的时候,一个QStyleSheetStyle会被生成并被设为应用程序实际的Style,而当前的Style则被reparent成QStyleSheetStyle的子对象,当应用程序或控件调用Style绘图的时候,实际调用的是QStyleSheetStyle对象,在QStyleSheetStyle类内部,会先调用函数按照StyleSheet定义的规则绘制UI,如果没有相关规则,再调用当前的Style对象的绘图函数绘制UI,所以QStyleSheet作为一个代理Style先对UI进行处理。



问:在Qt4中如何为对话框设置背景?

答:这个问题值得总结一下。大致有以下的思路和方法:

1.重写paintEvent()事件

在该事件中用画笔QPainter重画整个背景。该方法比较复杂,不建议初学者采用。

2.使用调色板类QPalette

  //以下代码中pWidget为指向要设置的widget的指针。  
QPalette palette = pWidget->palette();  
palette->setBrush(QPalette::Active,QPalette::Window,QBrush(Qt::red));  
pWidget->setPalette(palette); 
pWidget->setAutoBackground(true);  

推荐使用这种方法,大家可以查看一下setBrush()方法的定义:

  Palette::setBrush ( ColorGroup group, ColorRole role, const QBrush & brush ) 
 这个是一个重载版本,最为重要的是第二个参数,可以设置许多不同的类型。举例来说, 如果pWidget指向的是一个QListWidget或者QTextEdit对象,如果把第二个参数设置成QPalette::Text,则是设置其中文字的颜色;如果第二个参数是QPalette::BrightText,则是设置该对象被选中时,其文字的颜色;如果第二个参数QPalette::Bright则表示设置选中该对象时,高亮背景的颜色或者图片。该函数的功能是很强大的。

3.使用样式表。

  pWidget->setStyleSheet("background-color:blue;"); //设置背景颜色  
pWidget->setStyleSheet("background-image:url(:/folder/show.bmp);"); //设置背景图片此外,还有一些很有意思的方法,比如用setHtml(),insetHtml()这种用HTML语言的方式来指定的等等,大家可以多查查帮助文档搜索一下。

4.具体例子

  //设置为固定颜色 QPalette pal = pWidget->palette();  
pal.setColor(QPalette::Background, QColor(0,0,0)); //黑色  
pWidget->setPalette( pal ); //背景图片  
QPalette pal = pWidget->palette();  
pal.setBrush( QPixmap(图片文件名) ); //黑色  
pWidget->setPalette( pal );


原创粉丝点击