如何将QWidget的角落变圆

8

enter image description here

我想知道是否有一种方法可以将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_())

你的问题的解决方案应该在答案中,而不是在问题中。鼓励你自己提供答案! - Kuba hasn't forgotten Monica
谢谢!下次会将其发布为答案。 - alphanumeric
编辑系统的主要目的是让你可以修复出现问题的部分 :) 请随意将答案部分复制粘贴到答案中,然后编辑问题以删除答案。这就是我的意思。下次可能就太晚了 :) - Kuba hasn't forgotten Monica
3个回答

18

你可以使用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();

完美的解决方案! - FutureJJ

5

解决方案:

在此输入图片描述

这里是一个有效的Python解决方案,由 hank 使用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_())

0

如果您的小部件是静态的,那么它可以正常工作,但是如果您想调整其大小并仍然具有圆角,则需要覆盖paintEvent方法。它应该像这样:

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接