QSS的使用(二)——实现ColorLabel
在上一篇文章中,我们已经了解了QSS的基础使用,现在我们将会看到一个简单的例子来加深对QSS的理解。
需求分析
我们想要在界面中让文本显示出指定的颜色,现在有几种方案:
- 使用paintEvent手动计算文字大小和位置,然后绘制
- 利用QLabel可以识别HTML标签的特性实现彩色文字
- 利用QSS+QLabel实现彩色文字
我们逐一分析这三种方案的利弊。
首先是paintEvent的方案,这是三种方案中最灵活却也是最复杂的,通过重绘事件可以最大限度的发挥其灵活性,但对于字体大小的计算以及文字对齐的控制都需要自行处理,如此一来工程量不可谓不大,显然对于我们只是希望让文字显示出指定颜色的简单需求来说实现成本过高了。
其次是使用HTML标签的方案,这种方案的好处在于QLabel已经帮我们处理了文字的绘制和对齐,我们只需要将合适的HTML内容添加进去即可,虽然灵活性不如第一种,但是其简便性是显而易见的,例如:
label = QLabel(r'<font color="#ff0000">Qt</font>')
label.show()
这将会显示一个红色的“Qt”文字。
然而该方案的缺点也是显而易见的,虽然QLabel识别了HTML标签并且不会明文显示,但它确是实际存在于label中的:
print(label.text()) # '<font color="#ff0000">Qt</font>'
当我们需要设置/获取label中的文字时,就不得不想办法去除这个HTML标签,又或者当我们想要修改label的颜色时,就不得不对text做更复杂的处理,显然,我们的需求中也会包含以上类似的场景,所以这种看起来简单实际上暗含了复杂性的方案我也没有采用。事实上开发中经常会出现这种坑,所以在方案选择时三思而后行总是有好处的。
最后一种是QSS+QLabel的方案,也是目前我采用的方案。你可能已经猜到了,这种方案兼具QLabel的实用和QSS的简单,也不会在内部保存多余的信息,在牺牲部分灵活性的前提下是最简单也是最合适的解决方案,接下来我们就详细了解下这种方案的实现。
ColorLabel的实现
首先是定义默认颜色和QSS模板,模板用于后续的颜色设置:
var (
// 控制颜色的qss模板
colorStyle = "QLabel{color:%s;}"
// 默认颜色-黑色
defaultStyle = "QLabel{color:black;}"
)
其实空字符串""就表示使用系统自带样式,然而我这里为了统一就选用了黑色。
ColorLabel组件的定义,继承自QLabel,并保存自己的样式:
// ColorLabel 使用QSS显示彩色文字
type ColorLabel struct {
widgets.QLabel
// color style sheet
defaultColor string
}
接着是构造函数,函数的功能在注释中写的比较清楚了,关键在于它调用的两个方法:
// NewColorLabelWithColor 生成colorlabel,设置default color为color
// color为空则设置为黑色
// color可以是颜色对应的名字,例如"black", "green"
// 也可以是16进制的RGB值,例如 #ffffff, #ff08ff, #000000
func NewColorLabelWithColor(text, color string) *ColorLabel {
l := NewColorLabel(nil, 0)
l.SetDefaultColor(color)
l.SetDefaultColorText(text)
return l
}
SetDefaultColor用于给ColorLabel设置默认的颜色,而SetDefaultColorText则和setText槽一样,给label设置文字,并使用默认指定的颜色显示,通过这两个方法我们可以处理绝大部分的使用场景,现在来看看它们的实现:
// SetDefaultColor 设置defaultColor
// color为""时设置为黑色
// 不会改变现有text内容的颜色
func (l *ColorLabel) SetDefaultColor(color string) {
if color == "" {
l.defaultColor = defaultStyle
return
}
l.defaultColor = fmt.Sprintf(colorStyle, color)
}
// SetDefaultColorText 设置新的text值,并使其显示设置的default color
func (l *ColorLabel) SetDefaultColorText(text string) {
l.SetText(text)
l.SetStyleSheet(l.defaultColor)
}
当color为空字符串时使用默认颜色,否则设置为color指定的颜色,color可以是颜色的名字/16进制值。值得一提的是,修改默认颜色并不会影响已经显示的文字,如果想改变已经显示的文字的颜色,需要使用ChangeColor。
SetDefaultColorText则先使用SetText设置文字,随后添加QSS,因为这中间间隔相当短所以先添加QSS还是后添加不会有明显可见的区别,而且事件循环也会尽量将两次调用产生的重绘事件合并。
有时候我们也需要中途修改ColorLabel的颜色,或者颜色和文字一起修改,这时上面的方法就满足不了我们了,比如在这段代码里。
所以我们也实现了这些功能:
// ChangeColor 改变现有text的颜色
// 并且设置defaultColor为新的颜色
// color为""时设置为defaultStyle
func (l *ColorLabel) ChangeColor(color string) {
l.SetDefaultColor(color)
text := l.Text()
l.SetDefaultColorText(text)
}
// SetColorText 用color显示新的text
// color为""时显示defaultStyle
func (l *ColorLabel) SetColorText(text, color string) {
var style string
if color == "" {
style = defaultStyle
} else {
style = fmt.Sprintf(colorStyle, color)
}
l.SetText(text)
l.SetStyleSheet(style)
}
ChangeColor改变了已显示文字的颜色,并设置label默认的颜色为新的颜色。SetColorText则显示指定颜色的文字,不会影响label的默认设置。
有了这些方法,我们就能方便地设置文字的颜色了,而且因为我们继承自QLabel,所以可以使用QLabel提供的方法对文字的显示做更进一步的控制。
通过这个小例子,我们已经对QSS的实际使用有了较为具体的印象,在实际应用中QSS的强大功能将会为我们提供许多的便利,掌握QSS的使用会使你的开发技能更上一层楼。
欢迎大家提出意见,也欢迎大家关注我的项目。
QSS的使用(二)——实现ColorLabel的更多相关文章
- Qss样式(二)
Qss 其实就是一段文本,当然得按一定格式来写.下面请看Qss的语法格式: 选择器 { 属性1:值:属性2:值:--属性n:值:} 对应上篇文章的Qss样式: 现在我们可以来解释这段话的意思了: 对应 ...
- 统信DTK开发套件应用技术分享
近年来,信创产业发展迅猛,国产软硬件适配的需求日益增加,但国内CPU架构种类繁多,导致大量的适配投入.同时,由于底层代码质量不同.代码实现风格不统一等问题,造成自研操作系统的应用开发门槛高,应用生态严 ...
- Qt样式表之二:QSS语法及常用样式
一.简述 Qt样式表(以下统称QSS)的术语和语法规则几乎和CSS相同.如果你熟悉CSS,可以快速浏览以下内容.不熟悉的话可以先去W3School - CSS或者本人的CSS博客随笔简单了解一下. 在 ...
- Qt qss 使用
1.在资源文件建立一个qss文件.如blue.qss 2. 调用 #include "mainwindow.h" #include <QApplication> #in ...
- Pyqt QSS简单的Ui美化
什么是QSS QSS 是Qt StyleSheet 的简称,意思就是qt的样式表格,StyleSheet 可以像CSS一样的写样式.使页面美化跟代码层分开,利于维护. QSS的语法 同css一样,他也 ...
- QSS总结以及最近做的Qt项目
什么是QSS QSS称为Qt Style Sheets也就是Qt样式表,它是Qt提供的一种用来自定义控件外观的机制.QSS大量参考了CSS的内容,只不过QSS的功能比CSS要弱很多,体现在选择器要少, ...
- Qt之QAbstractItemView视图项拖拽(二)
一.需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式,是基于QDrag实现的,这个类是qt自己封装好了的,所 ...
- QT5 QSS
设计Qt程序Ui的时候,可以像WEB端使用CSS一样,使用QSS,使页面美化跟代码层分开,利于维护. 过程如下: 1.建立文本文件,写入样式表内容,更改文件后缀名为qss: 2.在工程中新建资源文件* ...
- Qt Creator项目中使用qss
近期学习qt .使用的编译器是qt creator ,学习过程中遇到的题就是 怎样将程序中将要用到的.qss 文件静态编译到.exe程序中,而不是在程序执行时动态加载.动态加载的最大问题在于一旦.qs ...
随机推荐
- Python(day1)
一.Python的属于解释型语言. 编译型:一次性,将全部的程序编译成二进制文件,然后再运行. 优点:运行速度快. 缺点:开发效率低,不能跨平台. 解释型:当你的程序运行时,一行一行的解释,并运行. ...
- EXCLE 导入 或 导出
首先要引用 NPOI.dll (可在网上下载!)//导入public void OnSubmit() { string path = Server.MapPat ...
- [Lyft Level 5 Challenge 2018 - Elimination Round][Codeforces 1033D. Divisors]
题目链接:1033D - Divisors 题目大意:给定\(n\)个数\(a_i\),每个数的约数个数为3到5个,求\(\prod_{i=1}^{n}a_i\)的约数个数.其中\(1 \leq n ...
- Linux下不同文件不同颜色的意义
通常,我们使用ls查看文件时,会出现不同颜色的文件,今天我就大概写一下不同颜色的代表意义: 蓝色————目录: 绿色————可执行文件: 红色————压缩文件: 浅蓝色————链接文件: 紫红色——— ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- 企业IT管理员IE11升级指南【13】—— 如何把IEMP迁移到GPP
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- [Swift]LeetCode605. 种花问题 | Can Place Flowers
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
- [Swift]LeetCode793. 阶乘函数后K个零 | Preimage Size of Factorial Zeroes Function
Let f(x) be the number of zeroes at the end of x!. (Recall that x! = 1 * 2 * 3 * ... * x, and by con ...
- 面试中程序员常见的Redis"刁难"问题,值得一读!
导读 在程序员面试过程中Redis相关的知识是常被问到的话题.作为一名在互联网技术行业打击过成百上千名的资深技术面试官,总结了面试过程中经常问到的问题.十分值得一读. Redis有哪些数据结构? 字符 ...
- requirejs、vue、vuex、vue-route的结合使用,您认为可行吗?
在五一节之前和一网友讨论前端技术时,对方提到vue.vue-route如果配合requirejs应用.当时的我没有想得很明白,也没能这位网友一个准确的回复,但我许诺于他五一研究后给他一个回复.本是一天 ...