【问题标题】:Customizing QRubberBand look while using cleanlooks style在使用 cleanlooks 样式时自定义 QrubberBand 外观
【发布时间】:2014-09-04 20:33:16
【问题描述】:

我尝试对我的自定义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_())

【问题讨论】:

    标签: python qt styles pyqt background-color


    【解决方案1】:

    我在 Qt 中看到了其他 GUI 元素的类似行为(例如在 Is it possible to change the colour of a QTableWidget row label? 中),我的印象是 Qt 中的样式可能很棘手,因为它可以覆盖用户特定的自定义。

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

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

    这应该可行:

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

    【讨论】:

    • 在这个简单的更改自定义工作正常进行之后。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2010-10-19
    • 2012-11-01
    • 1970-01-01
    相关资源
    最近更新 更多