PyQt风格指南

时间:2015-07-27 20:41:55

标签: python qt coding-style pyqt

我目前正在使用PyQt绑定在Python中编写我的第一个开源Qt应用程序。编码时我注意到了一些习惯,这可能会影响我的代码的可读性。具体来说,我有这些顾虑:

属性

因为我不希望有一个无限的函数列表,而装饰器用几百行填充我的所有类,所以我自己做了一个模板,使每个(PyQt-)属性适合一行代码从而将PEP-8完全扔出窗外并将其埋在六英尺以下:

propertyName = pyqtProperty(QVariant,fget=lambda self:QVariant(functionThatGetsThePropertyValue()),fset=lambda self,x:[defaultFunc1(),defaultFunc2(),] if x is None else [None for (variableToSet1,variableToSet2,) in ((x,otherInputVariables_inThisCaseOnlyX),) for _ in (functionToCall1(x),functionToCall2(x),)] )

以下是一些例子:

styleRules         = pyqtProperty(QVariant,fget=lambda self:QVariant(self.styleSheet()                   ),fset=lambda self,x:[self.setProperty('styleRules','')]                                 if x is None else [None                                                                                 for _ in (self.setStyleSheet(Helper.styleSheetDictToString(Helper.updateStyleSheet(self.styleSheet(),x))))] )
handle1Style       = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(1).styleSheet()),fset=lambda self,x:[self.setProperty('handle1Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle1Style'      ],) in ((x,),)                           for _ in (self.splitter.handle(1).setStyleSheet(x),)                                                      ] )
handle2Style       = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(2).styleSheet()),fset=lambda self,x:[self.setProperty('handle2Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle2Style'      ],) in ((x,),)                           for _ in (self.splitter.handle(2).setStyleSheet(x),)                                                      ] )
handle3Style       = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.handle(3).styleSheet()),fset=lambda self,x:[self.setProperty('handle3Style','background-color:rgba(0,0,0,0)')] if x is None else [None for (self.settings['handle3Style'      ],) in ((x,),)                           for _ in (self.splitter.handle(3).setStyleSheet(x),)                                                      ] )
keywordCollapsible = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.isCollapsible(1)      ),fset=lambda self,x:[self.setProperty('keywordCollapsible',False)                     ] if x is None else [None for (self.settings['keywordCollapsible'],) in ((True if x=='true'else False,),) for _ in (self.splitter.setCollapsible(1,True if x=='true'else False),)                                   ] )
controlCollapsible = pyqtProperty(QVariant,fget=lambda self:QVariant(self.splitter.isCollapsible(3)      ),fset=lambda self,x:[self.setProperty('controlCollapsible',False)                     ] if x is None else [None for (self.settings['controlCollapsible'],) in ((True if x=='true'else False,),) for _ in (self.splitter.setCollapsible(3,True if x=='true'else False),)                                   ] )
splitterSizes      = pyqtProperty(QVariant,fget=lambda self:QVariant(tuple(self.splitter.sizes())        ),fset=lambda self,x:[self.setProperty('splitterSizes',(0,0,0,0))                      ] if x is None else [None for (self.settings['splitterSizes'     ],) in ((x,),)                           for _ in (self.splitter.setSizes(x),)                                                                     ] )

这是

  • compact,
  • 有点可读(对我来说,至少),
  • 易于编辑且已
  • 在功能或可扩展性方面没有任何缺点。

将此与更符合PEP-8的人进行对比:

    @pyqtProperty(QVariant)
    def styleRules(self):
        return self.styleSheet()
    @styleRules.setter
    def styleRules(self,x):
        if x is None:
            self.setProperty('styleRules','')
        else:
            self.setStyleSheet(Helper.styleSheetDictToString(Helper.updateStyleSheet(self.styleSheet(),x)))

    @pyqtProperty(QVariant)
    def handle1Style(self):
        return self.splitter.handle(1).styleSheet()
    @handle1Style.setter
    def handle1Style(self):
        if x is None:
            self.setProperty('handle1Style','background-color:rgba(0,0,0,0)')
        else:
            self.settings['handle1Style'] = x
            self.splitter.handle(1).setStyleSheet(x)

    @pyqtProperty(QVariant)
    def handle2Style(self):
        return self.splitter.handle(2).styleSheet()
    @handle2Style.setter
    def handle2Style(self):
        if x is None:
            self.setProperty('handle2Style','background-color:rgba(0,0,0,0)')
        else:
            self.settings['handle2Style'] = x
            self.splitter.handle(2).setStyleSheet(x)

    @pyqtProperty(QVariant)
    def handle3Style(self):
        return self.splitter.handle(3).styleSheet()
    @handle3Style.setter
    def handle3Style(self):
        if x is None:
            self.setProperty('handle3Style','background-color:rgba(0,0,0,0)')
        else:
            self.settings['handle3Style'] = x
            self.splitter.handle(3).setStyleSheet(x)

    @pyqtProperty(QVariant)
    def keywordCollapsible(self):
        return self.splitter.isCollapsible(1)
    @keywordCollapsible.setter
    def keywordCollapsible(self):
        if x is None:
            self.setProperty('keywordCollapsible', False)

        else:
            self.settings['keywordCollapsible'] = True if x == 'true' else False
            self.splitter.setCollapsible(1,True if x == 'true' else False)

    @pyqtProperty(QVariant)
    def controlCollapsible(self):
        return self.splitter.isCollapsible(3)
    @controlCollapsible.setter
    def controlCollapsible(self):
        if x is None:
            self.setProperty('controlCollapsible',False)

        else:
            self.settings['controlCollapsible'] = True if x == 'true' else False
            self.splitter.setCollapsible(3,True if x == 'true' else False)

    @pyqtProperty(QVariant)
    def splitterSizes(self):
        return tuple(self.splitter.sizes())
    @splitterSizes.setter
    def splitterSizes(self):
        if x is None:
            self.setProperty('splitterSizes',(0,0,0,0))
        else:
            self.settings['splitterSizes'] = x
            self.splitter.setSizes(x)

我的风格是否可以接受,还是应该切换到更详细的版本?如果是这样,为什么?

子类

我倾向于为我使用的每个Qt对象创建子类。我只想从小部件内部定义我的小部件的属性和属性,而不是让父级完成所有工作。

我怎么知道,是否对特定实例进行子类化是否合适?什么时候它有自己的方法,属性,事件处理程序?当我知道我将创建新类的多个实例时,我是否应子类,或者为了审美目的而这样做是否可以接受?

嵌套类

因为我创建了很多类,所以我将它们组合在父类中,尽管我听说人们不鼓励使用嵌套的Python类,因为它们没有真正的用途。有没有其他理由不这样做,或者是否可以将这些类分组,仅仅是为了将它们分组?

0 个答案:

没有答案