如何使 QWidget 圆角

How to round QWidget corners

我想知道是否有办法使 Qt 小部件的角变圆?

from PyQt4 import QtCore, QtGui

class Custom(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        self.setWindowOpacity(0.9)
        self.setWindowFlags(QtCore.Qt.Popup|QtCore.Qt.FramelessWindowHint)
        self.setWindowTitle('Custom')
        self.resize(440,220)
        self.move(QtGui.QCursor.pos())

    def closeEvent(self, event):
        event.accept()
        sys.exit(app.exec_())

    def mousePressEvent(self, event):
        self.close() 

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = Custom()
    w.show()
    sys.exit(app.exec_())

你可以用QWidget.setMask(self, QRegion)来代替它。

C++ 示例:

QWidget *widget = new QWidget;
widget->resize(300, 200);

const int radius = 10;

QPainterPath path;
path.addRoundedRect(widget->rect(), radius, radius);
QRegion mask = QRegion(path.toFillPolygon().toPolygon());
widget->setMask(mask);

widget->show();

解决方案:

这是 hank 使用 C++ 概述的有效 Python 解决方案:

import sys
from PySide import QtCore, QtGui

class Custom(QtGui.QWidget):
    def __init__(self, *args, **kwargs):
        QtGui.QWidget.__init__(self, *args, **kwargs)
        self.setWindowOpacity(0.9)
        self.setWindowFlags(QtCore.Qt.Popup|QtCore.Qt.FramelessWindowHint)
        self.setWindowTitle('Custom')

        radius = 40.0
        path = QtGui.QPainterPath()
        self.resize(440,220)
        path.addRoundedRect(QtCore.QRectF(self.rect()), radius, radius)
        mask = QtGui.QRegion(path.toFillPolygon().toPolygon())
        self.setMask(mask)
        self.move(QtGui.QCursor.pos())

    def closeEvent(self, event):
        event.accept()
        sys.exit(app.exec_())

    def mousePressEvent(self, event):
        self.close() 

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    w = Custom()
    w.show()
    sys.exit(app.exec_())