Python入坑系列-pyside6桌面编程之QColor添加色彩彰显个性
myzbx 2024-12-04 13:58 21 浏览
通过本文章,你可以掌握以下内容:
- Pyside6 Color颜色模型
- Pyside6 Color色系介绍
- Pyside6更换系统主题
1、Pyside6 Color颜色模型
颜色通常以RGB(红色、绿色和蓝色)分量的形式指定,但也可以以HSV(色调、饱和度和亮度)和CMYK(青色、品红、黄色和黑色)分量的形式指定。此外,还可以使用颜色名称来指定颜色。颜色名称可以是SVG 1.0颜色名称中的任何一个
QColor构造函数基于RGB值创建颜色。要基于HSV或CMYK值创建QColor,分别使用toHsv()和toCmyk()函数。这些函数返回使用所需格式的颜色副本。此外,静态函数fromRgb()、fromHsv()和fromCmyk()可以从指定的值创建颜色。或者,可以使用convertTo()函数将颜色转换为任一三种格式(返回所需格式的颜色副本),或使用setRgb()、setHsv()和setCmyk()函数改变此颜色的格式。spec()函数指明颜色是如何被指定的。
可以通过向fromString()函数传递一个RGB字符串(如“#112233”)、一个ARGB字符串(如“#ff112233”)或一个颜色名称(如“blue”)来设置颜色。颜色名称取自SVG 1.0颜色名称。name()函数以“#000000”的格式返回颜色的名称。也可以使用setRgb()、setHsv()和setCmyk()设置颜色。要获取更亮或更暗的颜色,分别使用lighter()和darker()函数。
isValid()函数指示QColor是否完全合法。例如,RGB值超出范围的RGB颜色是非法的。出于性能原因,QColor大多忽略非法颜色,因此,使用无效颜色的结果是未定义的。颜色组件可以单独检索,例如使用red()、hue()和cyan()。
颜色组件的值也可以一次性使用getRgb()、getHsv()和getCmyk()函数检索。使用RGB颜色模型,颜色组件还可以通过rgb()访问。
有几个相关的非成员函数:QRgb是代表RGB值三元组(r, g, b)的unsigned int的类型定义。注意,它也可以保存alpha通道的值(更多信息,请参见Alpha-Blended Drawing部分)。qRed()、qBlue()和qGreen()函数返回给定QRgb值的相应组件,而qRgb()和qRgba()函数基于给定的组件值创建并返回QRgb三元组。最后,qAlpha()函数返回提供的QRgb的alpha组件,qGray()函数基于给定值计算并返回一个灰度值。QColor是平台和设备独立的。QColormap类将颜色映射到硬件上。
预定义颜色
命名空间中有 20 个预定义QColor对象QColorConstants,包括黑色、白色、主要和次要颜色、这些颜色的较暗版本,以及三种灰度。此外,QColorConstants.Svg命名空间为标准SVG颜色关键字名称定义了QColor对象。
QColorConstants.Color0、QColorConstants.Color1和QColorConstants.Transparent颜色用于特殊目的。QColorConstants.Color0(零像素值)和QColorConstants.Color1(非零像素值)是在QBitmaps中绘图的特殊颜色。使用QColorConstants.Color0绘制将位图位设置为0(透明;即背景),而使用QColorConstants.Color1绘制将位设置为1(不透明;即前景)。QColorConstants.Transparent用于指示透明像素。使用此值绘制时,将使用适合正在使用的底层像素格式的像素值。
HSV 颜色模型
RGB 模型是面向硬件的。它的表现接近大多数显示器的显示。相比之下,HSV 以更适合人类对颜色感知的方式表示颜色。例如,“强于”、“暗于”和“相反”的关系在 HSV 中很容易表达,但在 RGB 中很难表达。
HSV 与 RGB 一样,具有三个组成部分
- H(色调),如果颜色是彩色(不是灰色),则在 0 到 359 范围内;如果颜色是灰色,则毫无意义。它代表大多数人熟悉的色轮上的度数。红色为 0(度),绿色为 120,蓝色为 240。
- S代表饱和度,范围是0到255,它越大,颜色越强。浅灰色的饱和度接近 0;非常强烈的颜色饱和度接近 255。
- V 代表颜色,范围为 0 到 255,代表颜色的明度或亮度。 0 为黑色; 255 尽可能远离黑色。
2、Pyside6 Color色系介绍
色彩是视觉设计的重要组成部分,它不仅能影响美观性,还能影响情绪和行为。由于桌面程序默认组件的色彩比较单一,需要开发通过了解色彩系统给组件配色,给用户带来视觉冲击。
下面是自定义颜色标签,部分示例会使用到该类
import re
from PySide6.QtCore import Qt
from PySide6.QtGui import QPalette, QColor
from PySide6.QtWidgets import QLabel
class ColorLable(QLabel):
def __init__(self, text, color=None, fontcolor="white", align=Qt.AlignCenter):
"""接收color参数为:按颜色名称(如 "red")、十六进制颜色代码(如 "#000000")以及RGB值(如 rgb(83, 168, 255))"""
super(ColorLable, self).__init__()
self.setAlignment(align)
self.setStyleSheet(f"color:{fontcolor}")
self.setAutoFillBackground(True)
if color is None:
color = text
rgb_match = re.match(r'rgb\((\d+),\s*(\d+),\s*(\d+)\)', color)
if rgb_match:
r, g, b = map(int, rgb_match.groups())
qcolor = QColor(r, g, b)
else:
qcolor = QColor(color)
r, g, b, _ = qcolor.getRgb()
hex_str_upper = qcolor.name().upper()
if color is text:
self.setText(f"{color}<br>rgb({r}, {g}, {b})<br>{hex_str_upper}")
elif text == "":
self.setText(f"rgb({r}, {g}, {b})<br>{hex_str_upper}")
else:
self.setText(f"{color}<br>rgb({r}, {g}, {b})<br>{hex_str_upper}")
palette = self.palette()
palette.setColor(QPalette.Window, qcolor)
self.setPalette(palette)
原色
原色是不能通过混合其他颜色来创建的颜色。在传统的色彩理论中,原色包括红色、黄色和蓝色。在光的颜色混合(如屏幕显示)中,原色被认为是红色、绿色和蓝色(RGB)
示例代码如下:
import re
from PySide6.QtCore import Qt
from PySide6.QtGui import QPalette, QColor
from PySide6.QtWidgets import QLabel
class ColorLable(QLabel):
def __init__(self, text, color=None, fontcolor="white", align=Qt.AlignCenter):
"""接收color参数为:按颜色名称(如 "red")、十六进制颜色代码(如 "#000000")以及RGB值(如 rgb(83, 168, 255))"""
super(ColorLable, self).__init__()
self.setAlignment(align)
self.setStyleSheet(f"color:{fontcolor}")
self.setAutoFillBackground(True)
if color is None:
color = text
rgb_match = re.match(r'rgb\((\d+),\s*(\d+),\s*(\d+)\)', color)
if rgb_match:
r, g, b = map(int, rgb_match.groups())
qcolor = QColor(r, g, b)
else:
qcolor = QColor(color)
r, g, b, _ = qcolor.getRgb()
hex_str_upper = qcolor.name().upper()
if color is text:
self.setText(f"{color}<br>rgb({r}, {g}, {b})<br>{hex_str_upper}")
elif text == "":
self.setText(f"rgb({r}, {g}, {b})<br>{hex_str_upper}")
else:
self.setText(f"{text}<br>rgb({r}, {g}, {b})<br>{hex_str_upper}")
palette = self.palette()
palette.setColor(QPalette.Window, qcolor)
self.setPalette(palette)
主色
在视觉设计中指的是在一幅画面、设计作品或空间中占据主导地位的颜色。这种颜色通常是最引人注目的,能够影响整体的视觉效果和情感氛围。选择合适的主色调对于确保设计的协调性和传达正确的信息至关重要。
示例代码如下:
import sys
from PySide6.QtWidgets import *
from color.colorlable import ColorLable
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("QColor之主色-蓝色系")
self.setMinimumSize(700, 500)
vboxlayout = QVBoxLayout()
hboxlayout = QHBoxLayout();
vboxlayout.addWidget(ColorLable("Brand Color", "#409EFF","black"))
hboxlayout.addWidget(ColorLable("","rgb(83, 168, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(102, 177, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(121, 187, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(140, 197, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(160, 207, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(179, 216, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(198, 226, 255)","black"))
hboxlayout.addWidget(ColorLable("", "rgb(217, 236, 255)","black"))
vboxlayout.addLayout(hboxlayout)
widget = QWidget()
widget.setLayout(vboxlayout)
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
暖色
温暖色系主要包括红色、橙色、黄色及其衍生色调,这些颜色通常会让人联想到阳光、火焰和暖光等,能够给人带来温暖、舒适和活力的感觉。在视觉设计、艺术和室内装饰中,温暖色系经常被用来创造亲切、欢快的氛围
示例代码如下:
import sys
from PySide6.QtWidgets import *
from color.colorlable import ColorLable
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("QColor之暖色系")
self.setMinimumSize(700, 500)
layout = QHBoxLayout()
layout.addWidget(ColorLable("red"))
layout.addWidget(ColorLable("orange"))
layout.addWidget(ColorLable("yellow"))
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
辅助色
是色轮上互为对立的颜色,它们在视觉上形成鲜明的对比,能够相互强化对方的鲜艳度和视觉冲击力。当这些颜色组合在一起时,可以创造出极具吸引力和动态的视觉效果,除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)
示例代码如下:
import sys
from PySide6.QtWidgets import *
from color.colorlable import ColorLable
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("QColor之辅助色")
self.setMinimumSize(700, 500)
mainlayout = QHBoxLayout()
vboxsuccess = QVBoxLayout()
hboxsuccess = QHBoxLayout()
vboxsuccess.addWidget(ColorLable("Success", "#67C23A","black"))
hboxsuccess.addWidget(ColorLable("","rgb(225, 243, 216)","black"))
hboxsuccess.addWidget(ColorLable("", "rgb(240, 249, 235)","black"))
vboxsuccess.addLayout(hboxsuccess)
mainlayout.addLayout(vboxsuccess)
vboxwarn = QVBoxLayout()
hboxwarn = QHBoxLayout()
vboxwarn.addWidget(ColorLable("Warning", "#E6A23C", "black"))
hboxwarn.addWidget(ColorLable("", "rgb(250, 236, 216)", "black"))
hboxwarn.addWidget(ColorLable("", "rgb(253, 246, 236)", "black"))
vboxwarn.addLayout(hboxwarn)
mainlayout.addLayout(vboxwarn)
vboxdanger = QVBoxLayout()
hboxdanger = QHBoxLayout()
vboxdanger.addWidget(ColorLable("Danger", "#F56C6C", "black"))
hboxdanger.addWidget(ColorLable("", "rgb(253, 226, 226)", "black"))
hboxdanger.addWidget(ColorLable("", "rgb(254, 240, 240)", "black"))
vboxdanger.addLayout(hboxdanger)
mainlayout.addLayout(vboxdanger)
vboxinfo = QVBoxLayout()
hboxinfo = QHBoxLayout()
vboxinfo.addWidget(ColorLable("Info", "#909399", "black"))
hboxinfo.addWidget(ColorLable("", "rgb(233, 233, 235)", "black"))
hboxinfo.addWidget(ColorLable("", "rgb(244, 244, 245)", "black"))
vboxinfo.addLayout(hboxinfo)
mainlayout.addLayout(vboxinfo)
widget = QWidget()
widget.setLayout(mainlayout)
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
中性色
中性色指的是不包含或几乎不包含色相的颜色,它们在色彩搭配中起到平衡和稳定的作用。中性色包括黑色、白色、灰色,以及不同深浅的棕色和米色。这些颜色因其灵活性和适应性,在设计和艺术领域中被广泛应用。常用于文本、背景和边框颜色,通过运用不同的中性色,来表现层次结构。
示例代码如下:
import sys
from PySide6.QtWidgets import *
from color.colorlable import ColorLable
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.setWindowTitle("QColor之辅助色")
self.setMinimumSize(700, 500)
mainlayout = QHBoxLayout()
layout1 = QVBoxLayout()
layout1.addWidget(ColorLable("主要文字", "#303133"))
layout1.addWidget(ColorLable("常规文字", "#606266"))
layout1.addWidget(ColorLable("次要文字", "#909399"))
layout1.addWidget(ColorLable("占位文字", "#C0C4CC"))
mainlayout.addLayout(layout1)
layout2 = QVBoxLayout()
layout2.addWidget(ColorLable("一级边框", "#DCDFE6", "black"))
layout2.addWidget(ColorLable("二级边框", "#E4E7ED", "black"))
layout2.addWidget(ColorLable("三级边框", "#EBEEF5", "black"))
layout2.addWidget(ColorLable("四级边框", "#F2F6FC", "black"))
mainlayout.addLayout(layout2)
layout3 = QVBoxLayout()
layout3.addWidget(ColorLable("基础黑色", "#000000"))
layout3.addWidget(ColorLable("基础白色", "#FFFFFF", "black"))
layout3.addWidget(ColorLable("透明", "Transparent", "black"))
mainlayout.addLayout(layout3)
widget = QWidget()
widget.setLayout(mainlayout)
self.setCentralWidget(widget)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()
颜色选择器
Pyside6可以通过QColorDialog.getColor(),直接打开颜色选择器
import sys
from PySide6.QtWidgets import QApplication, QColorDialog
if __name__ == '__main__':
app = QApplication(sys.argv)
color = QColorDialog.getColor()
sys.exit(app.exec())
SVG颜色码表
3、更换系统主题
在PySide6与html页面实现主题切换类似,通过更换全局样式表实现,具体步骤如下:
1.定义样式表:为每个主题创建一个样式表文件,或者在一个大的样式表文件中为不同的主题定义不同的部分。
2. 加载样式表:在应用程序启动时,根据用户的主题选择加载相应的样式表。这可以通过读取一个配置文件、数据库或者其他持久化存储的方式来确定用户上次选择的主题。
3. 应用样式表:使用QApplication的setStyleSheet方法应用加载的样式表。这将影响应用程序中所有控件的外观。
4. 切换主题:提供一个界面元素(如菜单项、按钮等)供用户选择主题。当用户选择一个新主题时,重新加载对应的样式表并应用它。
5. 保存用户选择:将用户的主题选择保存到配置文件、数据库或其他持久化存储中,以便下次启动应用程序时能够恢复用户的选择。
示例代码如下:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QColor之主题切换")
self.setGeometry(100, 100, 400, 300)
# 创建中心窗口和布局
centralWidget = QWidget()
self.setCentralWidget(centralWidget)
layout = QVBoxLayout(centralWidget)
# 创建切换主题的按钮
self.toggleThemeBtn = QPushButton("切换")
self.toggleThemeBtn.clicked.connect(self.toggleTheme)
layout.addWidget(self.toggleThemeBtn)
# 默认主题
self.currentTheme = "light"
def toggleTheme(self):
if self.currentTheme == "light":
self.applyDarkTheme()
self.currentTheme = "dark"
else:
self.applyLightTheme()
self.currentTheme = "light"
def applyLightTheme(self):
self.setStyleSheet("""
QPushButton {background-color: white;color: black;}
QMainWindow {background-color: lightgray;}
""")
def applyDarkTheme(self):
self.setStyleSheet("""
QPushButton {background-color: black;color: white;}
QMainWindow {background-color: darkgray;}
""")
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
- 上一篇:使用html写一个简单的登录界面
- 下一篇:图像颜色特征提取
相关推荐
- 砌体植筋拉拔试验检验值到底是6.0KN,还是10.2KN,如何计算确定
-
砌体拉结筋植筋养护完成后,需对所植钢筋进行拉拔试验,以检验植筋的锚固强度是否满足设计要求。检测时,按照一定的抽样比例进行拉拔试验。根据《混凝土结构后锚固技术规程》JGJ145-2013,以同品种、同...
- 柴油机功率如何计算?计算柴油机功率需要哪些参数?
-
在汽车领域,对于柴油机功率的计算是一项重要的工作,它有助于我们更好地了解柴油机的性能和适用场景。下面我们就来详细探讨一下柴油机功率的计算方法以及所需的参数。首先,我们要了解计算柴油机功率常用的公式。在...
- 变压器短路阻抗的作用和计算方法(变压器短路阻抗的作用和计算方法是什么)
-
变压器短路阻抗的作用和计算方法短路阻抗是在负载试验中测量的一项数据,它是二次侧短接并流过额定电流时,一次侧施加的电压与额定电压的的百分数。那么测量变压器的短路阻抗有什么意义呢?其实变压器的阻抗电压乃是...
- 9.35m层高高支模支撑架计算书(支模架多高属于高支模)
-
某工厂新扩建的建筑面积为1989.2m^2,建筑物总体分为2层,但局部为4层。建筑物檐高19.4m,建筑物总高23m。建筑物呈长方形设置,长度为48.20m,宽度为23.88m,结构形式为框架结构...
- 吊篮(悬挂装置前梁加长)安全复核计算书
-
吊篮(悬挂装置前梁加长)安全复核计算书一种超常规搭设的高处作业吊篮,因使用要求将吊篮悬挂装置前梁加长设置,本计算书针对这种工况的校核,以作参考。计算依据:1、《高处作业吊篮》GB/T19155-...
- 电功率计算公式精编汇总(电功率计算视频讲解)
-
一、电功率计算公式:1在纯直流电路中:P=UIP=I2RP=U2/R式中:P---电功率(W),U---电压(V),I----电流(A),R---电阻(Ω)。2在单相交流电路中:P=UIcosφ...
- 灌注桩承载力检测方法及步骤(灌注桩承载力不够怎么办)
-
检测灌注桩的承载力是确保基础工程安全可靠的关键环节,检测结果的精细能准确为我们提供可靠的数据,让我们能准确判断桩基础的承载力,方便后续施工安排,同样也能让我们根据数据分辨出有问题桩基,采取可靠有效的措...
- 很哇塞的体积计算方法:向量叉乘 很哇塞的体积计算方法
-
高中数学必看:向量叉乘,体积的神。大家都知道a、b的向量是什么意思,但是a、b的向量又是什么?很多同学都不知道,向量的向量在高中阶段非常有用,虽然它是大学的知识,在高中阶段可以干两件事。·第一件事,表...
- 施工升降机基础(设置在地库顶板回顶)计算书
-
施工升降机基础(设置在地库顶板回顶)计算书计算依据:1、《施工现场设施安全设计计算手册》谢建民编著2、《建筑地基基础设计规范》GB50007-20113、《混凝土结构设计标准》GB/T50010-2...
- 剪力墙水平钢筋根数如何计算?(剪力墙水平钢筋绑扎搭接规范)
-
剪力墙水平钢筋根数的计算需综合考虑墙高、起步距离、间距及构造要求等因素,具体步骤如下及依据:1.基本计算公式水平钢筋根数计算公式为:根数=(墙高-起步距离)/间距(墙高-起步距离)/间距...
- 直流电路常用计算公式(直流电路常用计算公式有哪些)
-
1、电阻导体阻碍电流通过的能力叫做电阻,用字母R表示,单位欧(Ω)。R=ρl/s式中R-导体的电阻,欧(Ω);ρ-导体的电阻率,欧·米(Ω·m);l-导体的长度,米(m);s-导体的截面积,平方米(m...
- 电气主电路图的绘制特点(电气原理图主电路)
-
1、电气主电路图中的电气设备、元件,如电源进线、变压器、隔离开关、断路器、熔断器、避雷器等都垂直绘制,而母线则水平绘制。电气主电路图除特殊情况外,几乎无一例外地画成单线图,并以母线为核心将各个项目(如...
- 中考总复习:物理专题 功和机械能 (功的计算、功率、动能、势能)
-
中考物理专题:功与机械能解析一、力学中的功——能量转化的桥梁功是力对物体能量变化的量度,需满足两要素:作用在物体上的力、物体沿力方向移动距离。例如推箱子时,若箱子未移动,推力不做功;若箱子滑动,推力做...
- 40亿QQ号,不超过1G内存,如何去重?
-
分享一道网上很火的面试题:40亿QQ号,不超过1G的内存,如何去重?这是一个非常经典的海量数据去重问题,并且做了内存限制,最多只能1GB,本文跟大家探讨一下~~一、常规思路我们日常开发中,如果谈到去重...
- 填充墙体拉结筋植筋深度、孔径、拉拔试验承载力计算!
-
今天分享下植筋间距及保护层要求:根据JGJ145-2013混凝土后锚固技术规程要求植筋与混凝土结构边缘不应小于5mm,植筋为两根及以上时水平间距为不应小于5d(d为钢筋直径)。根据混凝土结构后锚固技...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 简介 (30)
- HTML 响应式设计 (31)
- HTML URL 编码 (32)
- HTML Web 服务器 (31)
- HTML 表单属性 (32)
- HTML 音频 (31)
- HTML5 支持 (33)
- HTML API (36)
- HTML 总结 (32)
- HTML 全局属性 (32)
- HTML 事件 (31)
- HTML 画布 (32)
- HTTP 方法 (30)
- 键盘快捷键 (30)
- CSS 语法 (35)
- CSS 轮廓宽度 (31)
- CSS 谷歌字体 (33)
- CSS 链接 (31)
- CSS 定位 (31)
- CSS 图片库 (32)
- CSS 图像精灵 (31)
- SVG 文本 (32)
- 时钟启动 (33)
- HTML 游戏 (34)
- JS Loop For (32)