我试图在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
执行此操作,因为:
border-radius
。弯曲的边框确实会显示,但角落仍然可见。QDialogs.setMask()
有效,但我(我知道)没有办法对面具进行反锯齿。以下是这样的:
答案 0 :(得分:3)
绘制事件被发送到窗口/窗口小部件,其中精确的矩形需要更新而不是窗口小部件的整个边界矩形。当你致电event.rect()
时,它会返回需要更新的矩形(据我所知)
尝试更改此行
painter.drawRoundedRect(event.rect(), 15, 15)
对此
painter.drawRoundedRect(self.rect(), 15, 15)
修改强>
您还需要在构造函数中的任何位置添加此行
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
希望这有帮助。
答案 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))
但这并不能回答我原来的问题。我想避免这种行为,而不是掩盖它。所以我不打算将此标记为答案。