1

我正在尝试将圆角添加到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()有效,但没有办法(据我所知)对面具进行抗锯齿处理。

看起来是这样的:

无处不在的边界

4

2 回答 2

3

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

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

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

在此处输入图像描述

希望这可以帮助。

于 2014-04-02T05:21:20.027 回答
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))

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

于 2014-04-02T02:24:42.190 回答