在pyqt中使用qss预编译语言减轻你的工作量

364 阅读2分钟

大致介绍

  • 项目起因 最近在写一个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
  • 使用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
    #!/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
    
    这样子去使用sqss会更加方便