Python 使用cleanlooks样式时自定义QRubberBand外观

Python 使用cleanlooks样式时自定义QRubberBand外观,python,qt,styles,pyqt,background-color,Python,Qt,Styles,Pyqt,Background Color,我尝试的是稍微定制一下我定制的QRubberBand的外观和感觉。我想用透明的蓝色选择矩形背景实现蓝色选择边。问题是,当我使用CleanLooks样式时,背景始终是透明的,但当我切换到例如WindowsVista样式时,一切正常 我正在Windows计算机上使用PyQt 10.4.3 下面是一个小代码示例,您可以从中看到这种奇怪的行为 from PyQt4 import QtGui,QtCore from PyQt4.QtCore import Qt class Selector(QtGui

我尝试的是稍微定制一下我定制的
QRubberBand
的外观和感觉。我想用透明的蓝色选择矩形背景实现蓝色选择边。问题是,当我使用CleanLooks样式时,背景始终是透明的,但当我切换到例如WindowsVista样式时,一切正常

我正在Windows计算机上使用PyQt 10.4.3

下面是一个小代码示例,您可以从中看到这种奇怪的行为

from PyQt4 import QtGui,QtCore
from PyQt4.QtCore import Qt


class Selector(QtGui.QRubberBand):
    """
    Custom QRubberBand
    """

    def __init__(self,*arg,**kwargs):

        super(Selector,self).__init__(*arg,**kwargs)


    def paintEvent(self, QPaintEvent):


        painter = QtGui.QPainter(self)

        # set pen
        painter.setPen(QtGui.QPen(Qt.blue,4))

        # set brush
        color = QtGui.QColor(Qt.blue)
        painter.setBrush(QtGui.QBrush(color))

        # set opacity
        painter.setOpacity(0.3)

        # draw rectangle
        painter.drawRect(QPaintEvent.rect())



class Panel(QtGui.QWidget):

    def __init__(self,parent = None):

        super(Panel,self).__init__(parent)

        self.rubberBand = Selector(QtGui.QRubberBand.Rectangle,self)

    def mousePressEvent(self, QMouseEvent):

        self.clickPosition = QMouseEvent.pos()
        self.rubberBand.setGeometry(QtCore.QRect(self.clickPosition,QtCore.QSize()))
        self.rubberBand.show()


    def mouseMoveEvent(self, QMouseEvent):

        pos = QMouseEvent.pos()
        self.rubberBand.setGeometry(QtCore.QRect(self.clickPosition,pos).normalized())


    def mouseReleaseEvent(self, QMouseEvent):

        self.rubberBand.hide()



if __name__ == "__main__":

    import sys

    app = QtGui.QApplication([])
    QtGui.QApplication.setStyle("cleanlooks")

    pn = Panel()
    pn.show()

    sys.exit(app.exec_())

我在Qt中看到了其他GUI元素(例如in)的类似行为,我的印象是Qt中的样式可能很复杂,因为它可以覆盖用户特定的定制

原则上,您可以实现自己的QStyle并将所有定制放在那里

这里更简单的方法可能是将元素的样式(此处
QRubberBand
)设置为不干扰的样式

这应该起作用:

class Selector(QtGui.QRubberBand):
    def __init__(self,*arg,**kwargs):
        super().__init__(*arg,**kwargs)
        self.setStyle(QtGui.QStyleFactory.create('windowsvista'))

在这一简单的更改之后,客户化工作正常。非常感谢。