Настройка просмотра QRubberBand при использовании стиля cleanlooks

Я пытаюсь настроить внешний вид моего пользовательского QRubberBand . Я хочу получить синий край выделения с прозрачным синим цветом прямоугольника выделения. Проблема в том, что фон всегда прозрачен, когда я использую стиль CleanLooks, но когда я переключаюсь на, например, стиль WindowsVista, все работает нормально.

Я использую PyQt 10.4.3 на компьютере с Windows.

Вот небольшой пример кода, из которого вы можете увидеть это странное поведение.

 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_()) 

    Я видел аналогичное поведение для других элементов GUI в Qt (например, можно ли изменить цвет метки строки QTableWidget? ), И мое впечатление было то, что стиль в Qt может быть сложным в том, что он может переопределять пользовательские настройки ,

    В принципе вы можете реализовать свой собственный QStyle и разместить там все настройки.

    Более простой способ – это, вероятно, установить стиль элемента (здесь QRubberBand ) в стиле, который не мешает.

    Это должно работать:

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