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

Qt中如何使用样式表QPalette以及相关注意事项

2017-02-22 07:19 405 查看
转自:http://blog.163.com/yx_xie2007/blog/static/102464253201122681631148/

设置一个widget的背景图片/颜色,我们可以使用调色板QPalette,而设置最重要的就是setBrush()画刷。刚google搜索了一下,发现用setBrush基本都只用了它的一种方法,但实际上其有两种用法。

 QPalette  palette;

      用法一:palette.setBrush(QPalette::Base, brush);

                     palette1.setBrush(QPalette::Active, QPalette::Base, brush);

        上述两种方式大同小异,除去group这一参数外,其余两个参数一模一样,其中第二个参数代表颜色角色!

        其主要通过枚举变量QPalette::ColorRole来定义,常用的枚举值有:

    QPalete::Window,通常指窗口部件的背景色;

    QPalette:WindowText,通常指窗口不见的前景色;

    QPalette::Base,指文本输入窗口部件(比如QtextEdit,QLinedit等)的背景色.

    QPalette::Text,与QPalette::Base一块使用,指文本输入窗口部件的前景色;

    QPalette::Button,指按钮窗口部件的背景色;

    QPalette::ButtonText,指按钮窗口部件的前景色.

 

 (上段枚举引用自博文:http://hi.baidu.com/tpxc/blog/item/4e7c72277682ba09918f9da8.html)

从上边这些枚举变量可知:针对不同的Qt控件,当我们用QPalette设置其背景/前景颜色时:需要指定不同的颜色角色参数!

      比如:对于QTextEdit,设置其背景时要使用QPalette::Base ; 对于QWidget则使用QPalette::Window 。如果指定错了,则这个调色板的使用会不生效!!

(我用QPalette::Button来设置一个QPushButton的背景,却一直不能生效,谁可以告诉我原因还是系统BUG?)

    用法二: palette.setBrush(ptr->backgroundRole(),brush())

 

      此时第一个参数直接取某一个窗口的颜色角色,而不是人为的去设置!用这种方式的好处在于:不用去考虑哪种控件该用哪个角色参数,这样避免出错! 但是这里有一个很重要的问题需要去注意:对于QTextEdit的背景角色,按照上边所说应该是QPalette::Base这个枚举值,其value为9。  但是当我们队QTextEdit控件调用backgrounRole()返回其角色值时:却发现这个值为10.显然二者不对应,但是对于QPushButton却是对应的!  对于这一点我感到很困惑!但是却一直没找到合理的解释,只有一种可能,那就是:这是一个系统BUG
!  

      所以上边提示我们:当用QPalette调色板来设置QTextEdit这个控件的背景颜色时:不要调用其自己的backgrounRole()来设置颜色角色,而应该自己手动设置成QPalette::Base !切记切记!!!!

===============================================================================

      那转回到QGraphicsWidget体系中QTextEdit背景颜色的设置上来:

我们将一个QWidget或其子类的控件用addWidget加入到到scene场景中时,我们可以认为其做了两步:

      首先:其建了一个代理item窗口,并将这个QWidget控件放到这个代理item窗口中去!

      而后:它再讲这个代理item像常规那样放到scene场景中!!!

      所以:当将一个QTextEdit放到scene场景中后,我们可以认为其前后有三层:最底下一层是场景所在的view,中间一层是代理item窗口,最上边一层才是真正的QTextEdit编辑框。  那么:要想让编辑框透明,看到view这一层,则不仅仅需要将QTextEdit本身设置为背景透明,而且还要将其所在的代理item窗口也设置为背景透明! 

 

     将QTextEdit设置为背景透明就用QPalette::Base为参来设置即可!而对于代理item窗口,其背景颜色角色枚举值为:QPalette::Window  (这个是我挨个试出来的,毕竟代理Item窗口QGraphicsProxyWidget类没有backgroundRole()函数 )。

   总结:QPalette虽然很好用,但是其中存在诸多问题,而且对于一些特殊情况:帮助文档上也没有给出说明,这些如若不注意都会出现很多问题。

PS:楼主说的按钮背景,试了一下,无法利用QPalette来设定背景(QPalette只能使按钮四周的边缘线变为想要的颜色),只能通过setStyleSheet来设定,下面这个语句实现的效果还蛮酷的哦~

button->setStyleSheet(tr("QPushButton{background-color:blue;}QPushButton:hover{background-color:green;}

                                         QPushButton:pressed{background-color:red;}"));

鼠标进入之前是蓝色,进入之后是绿色,按下之后是红色~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐