我正在尝试向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()
有效,但(据我所知)没有办法对 mask 进行反锯齿。
这是这样的:
最佳答案
绘制事件被发送到带有需要更新的精确矩形的窗口/小部件,而不是小部件的整个边界矩形。当您调用 event.rect()
时,它会返回需要更新的矩形(据我所知)
尝试更改此行
painter.drawRoundedRect(event.rect(), 15, 15)
对此
painter.drawRoundedRect(self.rect(), 15, 15)
编辑:
您还需要在构造函数中的任意位置添加此行
self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
希望这有帮助。
关于python - 如何阻止 PaintEvent 绘制子控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750523/