python - 如何阻止 PaintEvent 绘制子控件?

标签 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() 有效,但(据我所知)没有办法对 mask 进行反锯齿。

这是这样的:

borders everywhere

最佳答案

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

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

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

enter image description here

希望这有帮助。

关于python - 如何阻止 PaintEvent 绘制子控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22750523/

相关文章:

python - 剪辑二维列表直到内容形成一个矩形(Python)

qt - 获取QTabWidget中的所有选项卡小部件

python - 将多个QCheckBox插入到QTableWidget奇数行中

python - Qt槽PySide : QTextEdit doesn't get focus on window creation if there is a button in the window

python - 如何在 Python 程序中使用 Jinja2 模板?

python - sklearn、LassoCV() 和 ElasticCV() 损坏了吗?

python - 我可以使用 lxml 只下载部分 Internet 网页吗?

git - Qt Creator Git, checkout 命令

linux - 应用程序启动器和输入应用程序名称并从终端运行它有什么区别?

c++ - 无论文件如何,QFileIconProvider 都返回相同的图标