在这篇文章中我们将初步体验对qss的使用。并对在goqt中使用qss时的注意事项进行说明。

那么事不宜迟,现在开始我们的qss之旅吧。

QSS语法入门

qss是一种与css3相似的控制Qt组件的样式表,它有着与css3相似的语法,或者在某种意义上它可以说是对css3进行某些特化后的子集。

在日常开发中,Qt控件自身的外观有时很难满足我们的需要,这时候一般会有两种常见的解决方案,第一种是通过重写paintEvent来实现控件的自绘,这种方式最灵活,然而学习和使用成本也是最高的;另一种则是使用qss,通过qss控制widgets的外观表达。而qss的强大之处在于它不仅简单易学,而且功能强大,对自定义组件也能提供良好的支持。

下面我们就来简略学习一下qss的语法。

首先是选择器,和css3相同,qss需要用选择器来确定对哪些控件起作用:

QSS选择器:

名称 形式/示例 说明
万用选择器 * 顾名思义,选择所有的组件,包括自定义组件
类型选择器 QLabel 选择所有和选择器指定类型相同的组件,如果是继承自该组件的类型则也会被选择
属性选择器 QLabel[flat="false"] 选择具有某一qss属性的指定类型的控件,指定继承类型的派生类的实例不会被选择
class选择器 .QLabel 与类型选择器相似,不过它不会选择派生类型的实例
ID选择器 QLabel#name 通过setObjectName给控件的实例设置名字,通过这个名字选择该实例
子控件选择器 QDialog QLabel 将选择父控件中的所有指定子控件
直接子控件选择器 QDialog > QLabel 选择父控件的所有直接子控件,如果指定的子控件包含在其他子控件中将不会被选择

当需要同时使用多个选择器时,可以像这样SelectorA, SelectorB, ...

状态选择器

虽然文档上这么称呼,实际上就和css3的伪类选择器差不多。它可以选择处于某种状态的控件。

名称 形式/示例 说明
状态选择器 QPushButton:hover 当控件处于指定的状态时会被选择
非状态选择器 QPushButton:!hover 当控件不处于指定状态时会被选择
嵌套状态选择器 QPushButton:hover:!checked 当控件拥有全部指定的状态才会被选择

通过状态选择器,我们可以更细致的控制widgets。

局部选择器

它的真名叫Sub-Controls,意思是某个widget的某个局部组件,比如下拉框的下拉按钮,所以我们简称叫它局部选择器。

它的形式很简单:QComboBox::drop-down

通过两个冒号指定局部组件的名字,这些名字的Qt内置的。对局部选择器选中的内容修改属性将会影响局部组件的外观表现。

所有可用的局部组件名称都在Qt的文档中,有需要的可以进行查阅。

属性指定

看了那么多选择器,我们再来看看如何指定属性。

QLabel {
font-size: 20px;
color: #00ff00;
} QMainWindow {
background-image: url(bg.jpg);
} QComboBox::down-arrow:pressed {
position: relative;
top: 1px;
left: 1px;
}

可以看到,与css基本无异,值得注意的是定位相关属性只能用在局部组件上。

自定义组件和qss继承

首先明确一点,qss与css不同,子控件不会自动继承父控件的qss。所以想对子控件的样式进行调整就必须明确的用选择器选择子控件。如果你想让子控件从父控件继承qss属性,需要如下代码:

QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);

对于我们继承各种widget而来的自定义控件,可以在选择器里像原生控件一样指定,例如:

MyWidget {
font-size: 10px;
} MyWidget:hover {
backgorund: lightblue;
}

而在goqt中会有所不同,因为golang的继承是用“包含”做的一种模拟,你看起来是继承了某个widget,实际上只是在struct里包含了某个widget的实例而已,所以我们使用子控件的名字来定义qss是不起效果的,正确的做法如下:

type MyLabel struct {
widgets.QLabel
// some method
} type MyWidget struct {
widgets.QWidget
// some method
} // 错误做法
// myLabel.setStyleSheet("MyLabel{color:red;}")
// myWidget.setStyleSheet("MyWidget{backgorund:blue}") // 正确做法
myLabel.setStyleSheet("QLabel{color:red;}")
myWidget.setStyleSheet("QWidget{backgorund:blue}")

不用担心这样做会引发冲突,因为如上文所提,每个widget的qss都是独立的,所以在不做特别设置时完全没有任何问题。

接下来学什么

现在我们已经学习了QSS的基础语法,相信聪明的你已经开始查阅文档或者动手实践了。

在下一篇文章中我们将会接触一个使用了QSS的简单组件的实现,你也可以先看看源代码做一下预习。

如果觉得以上的代码对你有所帮助,也欢迎star我的项目:https://github.com/apocelipes/schannel-qt5

参考:

Qt Assistant: Qt Style Sheets

Qt Assistant: Qt Style Sheets Reference

【golang-GUI开发】QSS的使用(一)———QSS入门指南的更多相关文章

  1. Sublime Text3 + Golang搭建开发环境

    Sublime Text3 + Golang搭建开发环境 http://blog.csdn.net/aqiang912/article/details/46775409 1.安装git 因为golan ...

  2. Python GUI开发环境的搭建

    原文:Python GUI开发环境的搭建 最近对Python的开发又来了兴趣,对于Python的开发一直停留在一个表面层的认识,玩的部分比较大. Python的入手简单,语法让人爱不释手,在网络通信方 ...

  3. 漫谈GUI开发—各种平台UI开发概况

    前言: 在看这边文章前,可以建议看下:图形界面操作系统发展史——计算机界面发展历史回顾 从CS到BS,现在的前端开发,其实也是GUI开发范畴.现今 各平台的UI开发概况 HTML&CSS,Wi ...

  4. php 图形用户界面GUI 开发

    php 图形用户界面GUI 开发 一.下载指定系统扩展 1 2 http://pecl.php.net/package/ui http://pecl.php.net/package/ui/2.0.0/ ...

  5. 程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)

    程序员之路:python3+PyQt5+pycharm桌面GUI开发 http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html 先看效果: 图 1 没错 ...

  6. Python3+PyQt5+PyCharm 桌面GUI开发环境搭建

    Python3+PyQt5+PyCharm 桌面GUI开发环境搭建 一.安装python PyQt5所支持的python版本是不低于3.5版本 python3.5以上的版本安装:https://www ...

  7. Java -GUI开发九九乘法表

    Java GUI开发九九乘法表 (1)实现目标: 利用java自带的awt包,基础控件开发一个九九乘法表,点击可以显示对应的乘法口诀. (2)控件选择: 点击——Button 显示——TextFiel ...

  8. Golang的开发环境配置之SlickEdit篇

    Golang的开发环境通常有如下三种: 1. vi, emacs, notepad++ 2. Sublime Text 2/3 3. LiteIDE 不过,今天我想体验一下在slickedit当中使用 ...

  9. 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)

    作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  10. Python3 GUI开发(PyQt)安装和配置

    Python3 GUI开发(PyQt5)安装和配置: 下载安装好Miniconda3, 并且安装好jupyter 注意:最好关闭360杀毒软件或者把cmd加入信任,否则运行activate会有问题. ...

随机推荐

  1. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  2. Java中的一个类型转换问题

    一.Object转Integer Java中hibernate或者ResultSetHandler查询sql语句, 返回的object类型其实是Long类型, 而不是Integer类型, 因此此时直接 ...

  3. Apache启动不成功时,用命令行检测(新手)

    1,在配置Apache服务器时,经常要在httpd.conf 修改和添加一些代码,编写中,误写或者写错时,无法正常启动时,直接报错The requested operation has failed! ...

  4. Mybatis in 查询

    1.先创建一个传参的工具类 import java.util.HashMap; /** * * ClassName: DataMap * @Description: 封装Map, * @date 20 ...

  5. 点击a标签的文字后页面的跳转

    1.方法一 (1)js var html=""; html+="<a href=\"#\" onclick=\check('"+id+ ...

  6. MySQL基础操作1

    1.进入MySQL的两种方式: (1).MySQL自带的控制台 直接输入密码 (2).命令提示符: mysql -uroot -proot 然后再输入密码 MySQL常用指令 ------- 1.启动 ...

  7. 用apache和tomcat搭建集群,实现负载均衡

    型的企业应用每天都需要承受巨大的访问量,在着巨大访问量的背后有数台服务器支撑着,如果一台服务器崩溃了,那么其他服务器可以使企业应用继续运行,用户对服务器的运作是透明化的,如何实现这种透明化呢?由如下问 ...

  8. SQL Server 自动循环归档分区数据脚本

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/表分区 概述 在很多业务场景下我们需要对一些记录量比较大的表进行分区,同时为了保证性能需要将一些旧的数据进行归档.在分区表很多的情 ...

  9. BI项目记(二):给我接套数据

    这次故事的主角还是小D,小D工作在一家传统公司的信息部门,负责数据仓库系统的运维和开发. 话说有一天,小D被教导老板的office,老板给布置了一个任务,让小D在现有数据仓库里接入刚上线的两个系统的数 ...

  10. 前端开发JS白板编程题目若干

    在前端开发参加面试的时候,无论是校招还是社招,往往都会碰到让我们直接在白纸或者白板上手撸代码的题目.由于是手撸代码,这些题目肯定不会过于复杂和冗长,否则面试那么一小会时间根本写不完.本文总结了几个我本 ...