如何阻止paintEvent绘制子窗口小部件?

时间:2014-03-30 22:09:12

标签: python qt pyside qdialog paintevent

我试图在QDialog添加圆角。我定义了自己的paintEvent方法来创建圆角。它正在工作,但它为所有东西添加了圆形边框。即使光标正在变成边框。有没有办法禁用这种行为?

示例代码:

from PySide import QtCore, QtGui


class RenameDialog(QtGui.QDialog):
    def __init__(self, parent=None, **kwargs):
        super(RenameDialog, self).__init__(
            parent=parent, f=QtCore.Qt.CustomizeWindowHint)
        self.fieldA = QtGui.QLineEdit(self)
        self.fieldB = QtGui.QLineEdit(self)

        self.setLayout(QtGui.QHBoxLayout())
        self.layout().addWidget(self.fieldA)
        self.layout().addWidget(self.fieldB)

        # Set background transparent.  Only items drawn in paintEvent
        # will be visible.
        palette = QtGui.QPalette()
        palette.setColor(QtGui.QPalette.Base, QtCore.Qt.transparent)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.setPalette(palette)

    def paintEvent(self, event):
        painter = QtGui.QPainter(self)
        fillColor = QtGui.QColor(75, 75, 75, 255)
        lineColor = QtCore.Qt.gray

        painter.setRenderHint(QtGui.QPainter.Antialiasing)
        painter.setPen(QtGui.QPen(QtGui.QBrush(lineColor), 2.0))
        painter.setBrush(QtGui.QBrush(fillColor))
        painter.drawRoundedRect(event.rect(), 15, 15)

我尝试使用paintEvent执行此操作,因为:

  • QDialog样式表无法使用border-radius。弯曲的边框确实会显示,但角落仍然可见。
  • QDialogs.setMask()有效,但我(我知道)没有办法对面具进行反锯齿。

以下是这样的:

borders everywhere

2 个答案:

答案 0 :(得分:3)

绘制事件被发送到窗口/窗口小部件,其中精确的矩形需要更新而不是窗口小部件的整个边界矩形。当你致电event.rect()时,它会返回需要更新的矩形(据我所知)

尝试更改此行     painter.drawRoundedRect(event.rect(), 15, 15) 对此     painter.drawRoundedRect(self.rect(), 15, 15)

修改 您还需要在构造函数中的任何位置添加此行 self.setWindowFlags(QtCore.Qt.FramelessWindowHint)

enter image description here

希望这有帮助。

答案 1 :(得分:0)

我现在找到了解决办法。您可以在子项上使用QPainter.eraseRect并设置正确的样式表来隐藏额外的边框。我还发现用QPainter.fillRect在违规区域上画画也很有效。

def paintEvent(self, event):
    painter = QtGui.QPainter(self)
    fillColor = QtGui.QColor(75, 75, 75, 255)
    lineColor = QtCore.Qt.gray

    painter.setRenderHint(QtGui.QPainter.Antialiasing)
    painter.setPen(QtGui.QPen(QtGui.QBrush(lineColor), 2.0))
    painter.setBrush(QtGui.QBrush(fillColor))
    painter.drawRoundedRect(event.rect(), 15, 15)

    # Sketchy fix:
    painter.eraseRect(self.childrenRect())
    # OR
    painter.fillRect(self.childrenRect(), QtGui.QBrush(fillColor))

但这并不能回答我原来的问题。我想避免这种行为,而不是掩盖它。所以我不打算将此标记为答案。