太阳神三国杀的界面很绚丽,界面上按钮的图标,鼠标移入移出时图标的变化,日志和聊天Widget的边框和半透明等效果,既可以通过代码来控制,也可以使用皮肤文件qss进行控制.下面我们分析一下三国杀的qss文件.

在main.cpp中可以看到如下几句关键代码:

QDir::setCurrent(qApp->applicationDirPath());//设置当前目录为程序的可执行文件所在目录

//设置皮肤
    QFile file("sanguosha.qss");
    if(file.open(QIODevice::ReadOnly)){
        QTextStream stream(&file);
        qApp->setStyleSheet(stream.readAll());
    }

首先设置当前路径,并在当前路径下加载sanguosha.qss文件,将其内容全部读取出来作为qApp->setStyleSheet的参数,从而设置了应用程序的皮肤.

要学习使用qss,首先需要了解qss中的选择器语法,常用的有如下几类:

1 控件类名#控件名称         指定控件类,控件名称 后跟效果描述

2 控件类名:状态                   指定控件类,控件的状态 后跟效果描述 如按钮的鼠标悬停状态等等

3 控件类名::子控件类名      指定控件类,子控件类名 后跟效果描述 如分组框中的按钮

4 控件类名                            直接指定控件类 后跟效果描述 将影响程序中所有该类控件的显示效果

5 控件名称[属性名称=属性值] 指定控件类,控件实例的属性值 后跟效果描述 只影响控件实例中属性值符合条件的控件显示效果

下面看看sanguosha.qss文件的内容,并逐一解释.

QProgressBar{
    color : solid gray;
    border: 2px solid gray;
    border-radius: 5px;
    background: transparent;
    padding: 0px;
    text-align : center ;
}
QProgressBar::chunk{     //设置进度块的背景颜色
    background: #B22222;
}

QTextEdit{
    border: 10px;
    border-image: url(image/system/border.png)10 10 10 10 ;//设置边框显示的图片
    //设置背景色,注意使用rgba,有透明效果
}

QTextEdit[description="true"]{//对QTextEdit控件,而且其description属性必须设置为true的实例生效
    border: 10px;
 border-image: none;
    background-color: rgba(255,255,255,255);
}

QTextEdit QScrollBar:vertical  {  //这是一个子控件选择器,设置QTextEdit的子控件QScrollBar--状态为垂直时的效果

margin: 22px 0 22px 0;
}

QScrollBar:add-page  //QScrollBar状态为add-page时的效果
{
    
}

QScrollBar:sub-page //QScrollBar状态为sub-page时的效果
{
     background-color: rgba(0,0,0,200);
}

QScrollBar::add-line:vertical  {  //::表示子控件  :表示所处状态

height: 15px;
     subcontrol-position: bottom;
     subcontrol-origin: margin;
 }

QScrollBar::sub-line:vertical  {//::表示子控件  :表示所处状态

height: 15px;
     subcontrol-position: top;
     subcontrol-origin: margin;
 }

QScrollBar::handle:vertical    {//::表示子控件  :表示所处状态
    border : 2px solid gray;
    border-radius: 6px;
    background-color: solid gray;
    min-height : 12px;
}

QScrollBar::up-arrow:vertical  //::表示子控件  :表示所处状态
{
    border-image: url(image/system/button/scroll-up-arrow.png);
}

QScrollBar::down-arrow:vertical  //::表示子控件  :表示所处状态
{
    border-image: url(image/system/button/scroll-down-arrow.png);
}

QLineEdit#chat_edit{  //控件类名称#控件名称 表示只针对叫做chat_edit的QLineEdit生效
   
    color: white;
    border: 10px transparent;
    height: 20px;
    border-image: url(image/system/border.png)10 10 10 10 ;
 }

QStatusBar::item {
     border: 0px solid grey;
 }
 
QStatusBar{
 background-image: url(image/system/skill-dock.png);
 color:white;
}

QMenu[private_pile="true"]{  //中括号指定属性值,只有属性值满足,效果才生效
   
    border-radius: 5px;
    color: white;
}

QPushButton[private_pile="true"]{ //中括号指定属性值,只有属性值满足,效果才生效
    background-color: rgba(43,63,53,100);
    border-radius: 5px;
    color: white;
}

QPushButton[game_control="true"]{ //中括号指定属性值,只有属性值满足,效果才生效
    border: 0px solid gray;
    font: 12px;
    border-radius: 5px;
    padding: 6px 12px 6px 12px;
}

QPushButton#free-discard{  //指定一个按钮上的背景图
    background-image: url(image/system/button/free-discard.png);
}

QPushButton#free-discard:disabled{ //指定一个按钮在disabled状态下的背景图
    background-image: url(image/system/button/free-discard-disabled.png);
}

QPushButton#reverse-select{ //指定一个按钮上的背景图
    background-image: url(image/system/button/reverse-select.png);
}

QPushButton#reverse-select:disabled{ //指定一个按钮在disabled状态下的背景图
    background-image: url(image/system/button/reverse-select-disabled.png);
}

QPushButton#pause{
    background-image: url(image/system/button/pause.png);
}

QPushButton#play{
    background-image: url(image/system/button/play.png);
}

QPushButton#slow-down{
    background-image: url(image/system/button/slow-down.png);
}

QPushButton#speed-up{
    background-image: url(image/system/button/speed-up.png);
}

QPushButton#uniform{
    background-image: url(image/system/button/uniform.png);
}

//由于skill_bar_container是状态栏的名称,而状态栏是自动生成的,因此需要在代码中特意设置一次状态栏的名称,以便于qss中设置样式.

//main_window->statusBar()->setObjectName("skill_bar_container");

#skill_bar_container QPushButton{  //#空间名称 子控件 指定skill_bar_container控件下包含的所有QPushButton类的效果
 background-image: url(image/system/button/back.png);
        border: 1px solid gray;
        border-radius: 4px;
 color: yellow;
 font: 12px;
 padding: 6px 12px 6px 12px;
}
#skill_bar_container QPushButton:disabled{  //指定skill_bar_container控件下包含的所有QPushButton类在disabled时的效果
 background-image: url(image/system/button/back_shade.png);
        border-radius: 4px;
 color: white;
 font: 12px;
}
#skill_bar_container QCheckBox{
 border: 1px solid gray;
        border-radius: 4px;
 color: yellow;
 font: 12px;
 padding: 1px 12px 1px 8px;
}
#skill_bar_container QCheckBox::indicator{
 height: 0px;
 width: 0px;
}
#skill_bar_container QCheckBox:unchecked{
 background-image: url(image/system/button/frequent_checkbox/unchecked.png);
}
#skill_bar_container QCheckBox:unchecked:hover{
 background-image: url(image/system/button/frequent_checkbox/unchecked_hover.png);
}
#skill_bar_container QCheckBox:unchecked:pressed{
 background-image: url(image/system/button/frequent_checkbox/unchecked_press.png);
}
#skill_bar_container QCheckBox:checked{
 background-image: url(image/system/button/frequent_checkbox/checked.png);
}
#skill_bar_container QCheckBox:checked:hover{
 background-image: url(image/system/button/frequent_checkbox/checked_hover.png);
}
#skill_bar_container QCheckBox:checked:pressed{
 background-image: url(image/system/button/frequent_checkbox/checked_press.png);
}
#skill_bar_container QComboBox{
 background-image: url(image/system/button/back2.png);
 border: 1px solid gray;
 border-radius: 3px;
 color: white;
 padding: 1px 18px 1px 3px;
}
#skill_bar_container QComboBox:on{
 padding-left: 4px;
 padding-top: 3px;
}
#skill_bar_container QComboBox::drop-down{
 border-bottom-right-radius: 3px;
 border-left-color: darkgray;
 border-left-style: solid;
 border-left-width: 1px;
 border-top-right-radius: 3px;
 subcontrol-origin: padding;
 subcontrol-position: top right;
 width: 15px;
}
#skill_bar_container QComboBox::down-arrow:on{
 left: 1px;
 top: 1px;
}

http://blog.csdn.net/henreash/article/details/7868137

vs2008编译QT开源项目--太阳神三国杀源码分析(三) 皮肤的更多相关文章

  1. vs2008编译QT开源项目三国杀(五篇文章)

    请参看 http://tieba.baidu.com/f?kz=1508964881 按照上面的网址教程,下载三国杀源码,swig工具,并下载最新的QT4.8.2 for vs2008.我本机已经安装 ...

  2. 开源分布式数据库中间件MyCat源码分析系列

    MyCat是当下很火的开源分布式数据库中间件,特意花费了一些精力研究其实现方式与内部机制,在此针对某些较为重要的源码进行粗浅的分析,希望与感兴趣的朋友交流探讨. 本源码分析系列主要针对代码实现,配置. ...

  3. 一个Python开源项目-哈勃沙箱源码剖析(下)

    前言 在上一篇中,我们讲解了哈勃沙箱的技术点,详细分析了静态检测和动态检测的流程.本篇接着对动态检测的关键技术点进行分析,包括strace,sysdig,volatility.volatility的介 ...

  4. 钱管够,你能接这个项目吗?+ tomcat源码分析

    最近看了几个咕泡学院的公开课,课堂老师讲到下面这两个经历. 1:钱给够,你有没有能力接下这个全国性的项目 平时也会有怀才不遇的时候,但是当你遇到这个机会的时候,有没有信心去接下这个单子呢? 信心和能力 ...

  5. Qt update刷新之源码分析(三)

    大家好,我是IT文艺男,来自一线大厂的一线程序员 上次视频给大家从源码层面剖析了Qt刷新事件(QEvent::UpdateRequest)的处理流程,这次视频主要从源码层面剖析对刷新事件的进一步处理, ...

  6. 鸿蒙内核源码分析(编译脚本篇) | 如何防编译环境中的牛皮癣 | 百篇博客分析OpenHarmony源码 | v58.01

    百篇博客系列篇.本篇为: v58.xx 鸿蒙内核源码分析(环境脚本篇) | 编译鸿蒙原来如此简单 | 51.c.h.o 本篇用两个脚本完成鸿蒙(L1)的编译环境安装/源码下载/编译过程,让编译,调试鸿 ...

  7. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  8. QT源码分析(从QApplication开始)

    QT源码分析 转载自:http://no001.blog.51cto.com/1142339/282130 今天,在给同学讲东西的时候,谈到了Qt源代码的问题,才发现自己对Qt机制的了解是在太少了,而 ...

  9. [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)

    [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护) 标签: .net加密产品c#dll工具 2011-03-24 21:06 27009人阅读 评论(13) 收藏 举报 分类: C ...

随机推荐

  1. Hadoop 配置文件简介

    1.core-site.xml文件 这是一个描述集群中NameNode结点的URI-统一资源标识符(包括协议,主机名称,端口号),集群里面的每一台机器都需要知道 NameNode的地址.DataNod ...

  2. C# 仿金山毒霸启动和关闭淡入淡出效果

    原文 C# 仿金山毒霸启动和关闭淡入淡出效果 01 #region 窗体关闭效果 02   03 #region 私有方法 04 [DllImportAttribute("user32.dl ...

  3. GDOI2015——已成梦

    今年GDOI(2015)在韶关北江中学(没记错的话应该是武江区)举行,感觉这五天就是一场梦,一场包含苦辣的梦. Day0 坐了一个上午的车,而且车内的空气又不好,感觉整个人都累倒下了. 到了北江之后吃 ...

  4. Eclipse用法和技巧二十二:快速调整字体大小

    团队代码review的时候,一般都会一堆人围着显示器,或者投影仪.这个时候调整代码字体大小就显得很重要.下面直接说操作方式.        步骤一:Windows -> Preference 步 ...

  5. javascript笔记整理(对象基础)

    一.名词解释 1.基于对象(一切皆对象,以对象的概念来编程) 2.面向对象编程(Object Oriented Programming,OOP) A.对象(JavaScript 中的所有事物都是对象) ...

  6. Redis bio

    还是一个很小的模块. bio就是background io的意思,既然要background,就要创建线程,创建几个线程呢?有几种类型的io,就创建几个线程.同一种类型的job需要排队,所以存放各自的 ...

  7. C++辛格尔顿

    设计模式是编程的焦点.经常在面试时进行审查,Singleton模式是最简单的.最常见的.大部分的主模式.所以大部分的采访是测试考试的Singleton设计模式. 以下我们就来看看单例模式怎样实现(C+ ...

  8. [置顶] Android下实现自动关机的方法总结

    最近在网上看了一些Android下实现自动关机的方法,有的不行,有的只适用一些机型,有的适用于大部分机型,笔者在此总结一下 法一: Intent newIntent = new Intent(Inte ...

  9. QFrame好像是万能的(可以随意画线,或者图片,放在其它元素之间做点缀,还可OnClick)

    QFrame *fr2=new QFrame(this); fr2->setGeometry(0,140,90,40); fr2->setStyleSheet("backgrou ...

  10. 基于visual Studio2013解决面试题之0510连续数之和

     题目