大致介绍
- 项目起因 最近在写一个win10环境下的右键菜单工具,顺便仿造element开发了一套组建库,但是在开发组件库的过程中书写了十分大量的qss代码。 我想起了我开发过前端的工程化项目,于是我想在写qss的时候就很想有一个预编语言去节省自己的工作量。 搜了一圈,发现python环境下只有2.x版本才有python-sass实现。 因为和项目的python版本差距有点大,于是选择了造轮子,自己实现了一个sqss(sass的简易版)来减轻代码量
sqss特性
- 变量
- 表达式
- 嵌套
- 模块化
- 混入(Mixins)
- 继承(Extend/Inheritance)
- 分支伪类简写
.btn:(hover|focus) // 会被编译为 .btn:hover, .btn:focus
如何使用
如果你正在使用原始的pip管理你的项目,这里建议你可以尝试一下新的工具(poetry去管理你的环境与依赖)
所以下面会有俩种方法去让你在项目中安装sqss
- 使用pip
- 安装sqss依赖
pip install sqss
- 安装sqss依赖
- 使用poetry
- 如果当前项目没有使用过poetry,那么你需要初始化一下poetry项目
# 输入你的配置信息 poetry init- 安装sqss依赖
poetry add sqss
- 使用sqss编译器在项目中
from sqss import Compiler print( str(Compiler.deal_str("""\ @mixin fun($arg1, $arg2) #{$arg1} color: #{$arg2} .main @include fun(test1, #fff) @include fun(test2, #fff) """)) )- 你也可以自定义一个基类widget,例如BaseWidget
BaseWidget.py
这样子去使用sqss会更加方便#!/usr/bin/env python # -*- encoding: utf-8 -*- import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton from PyQt5.QtWidgets import QWidget from sqss import Compiler class BaseWidget( QWidget ): def __init__(self, parent=None): super().__init__(parent) def setSQSS(self, sqss: str) -> None: print(str(Compiler.deal_str(sqss))) self.setStyleSheet(str(Compiler.deal_str(sqss))) if __name__ == '__main__': app = QApplication(sys.argv) window = QMainWindow() window.setMinimumSize(200, 200) temp = BaseWidget(window) changeTestProperty = QPushButton(temp) changeTestProperty.setText('change test property') temp.setSQSS('''\ @mixin type-btn($bg-color, $bg-color-hover) width: 140px height: $size border: 1px solid gray border-radius: 10px background-color: #{$bg-color} &:hover background-color: #{$bg-color-hover} BaseWidget $size: 40px QPushButton @include type-btn(#ffffff, #eeeeee) ''') window.setCentralWidget(temp) window.show() sys._excepthook = sys.excepthook def myExceptionHook(exctype, value, traceback): print(exctype, value, traceback) sys._excepthook(exctype, value, traceback) sys.exit(1) sys.excepthook = myExceptionHook try: sys.exit(app.exec_()) except: pass - 你也可以自定义一个基类widget,例如BaseWidget