8

enter image description here

I wonder if there is there a way to round Qt widget corners?

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_())
alphanumeric
  • 17,967
  • 64
  • 244
  • 392

3 Answers3

17

You can use QWidget.setMask(self, QRegion) for it.

An example in 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
  • 9,553
  • 3
  • 35
  • 50
5

SOLUTION:

enter image description here

Here is working Python solution outlined by hank using C++:

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_())
Community
  • 1
  • 1
alphanumeric
  • 17,967
  • 64
  • 244
  • 392
0

It works if your widget is static, but if you want to resize it and still have rounded corners, there is the paintEvent method you need to override. It should look like this:

void Widget::paintEvent(QPaintEvent *event)
{
    const int radius = 7;

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

    QWidget::paintEvent(event);
}
tdy
  • 36,675
  • 19
  • 86
  • 83