现在我来详细讲解一下“pyqt5 设置窗口圆角及阴影的操作”的完整攻略。
1. 设置窗口圆角
为了设置窗口圆角,很多人可能会选择使用 setStyleSheet
方法。但是,这种方法设置的圆角并不是真正的圆角,而只是使用了显示效果相似的方式去处理。
因此,在这里我将介绍使用 QSS(Qt Style Sheet)与自定义窗体类的方法实现真正的圆角效果。
1.1 通过 QSS 实现窗口圆角
通过在 QSS 中使用 border-radius
属性,可以实现对窗口的圆角控制。具体实现步骤如下:
- 使用 QWidget 作为基类,创建自定义的 MainWindow 类,并重写其中的
paintEvent
和resizeEvent
方法。 - 在
paintEvent
方法中使用 QPainter 绘制窗口的背景与边框。这里我们可以使用自定义的 QSS 样式,来实现圆角效果。 - 在
resizeEvent
方法中使用 setMask 方法来设置窗口的形状,使其变为圆角矩形。
下面是一个简单的示例代码,可以实现窗口左上角和右下角为圆角矩形。
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter, QBrush, QPen
from PyQt5.QtCore import Qt, QRect
class MainWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowFlags(Qt.FramelessWindowHint)
self.setAttribute(Qt.WA_TranslucentBackground)
def paintEvent(self,event):
painter = QPainter(self)
# 设置圆角矩形区域,这里是左上角和右下角为圆角
path = QPainterPath()
path.moveTo(10, 0)
path.lineTo(self.width()-10, 0)
path.arcTo(self.width()-20, 0, 20, 20, 0, 90);
path.lineTo(self.width(), self.height()-10)
path.arcTo(self.width()-20, self.height()-20, 20, 20, 0, -90);
path.lineTo(10, self.height())
path.arcTo(0, self.height()-20, 20, 20, 90, -90);
path.lineTo(0, 20)
path.arcTo(0, 0, 20, 20, 180, -90);
painter.setRenderHint(QPainter.Antialiasing)
painter.setBrush(QBrush(QColor(255, 255, 255, 200)))
painter.setPen(QPen(Qt.transparent))
painter.drawPath(path)
def resizeEvent(self,event):
region = QRegion(self.rect(), QRegion.Rectangle)
path = QPainterPath()
# 设置圆角矩形区域,这里是左上角和右下角为圆角
path.moveTo(10, 0)
path.lineTo(self.width()-10, 0)
path.arcTo(self.width()-20, 0, 20, 20, 0, 90);
path.lineTo(self.width(), self.height()-10)
path.arcTo(self.width()-20, self.height()-20, 20, 20, 0, -90);
path.lineTo(10, self.height())
path.arcTo(0, self.height()-20, 20, 20, 90, -90);
path.lineTo(0, 20)
path.arcTo(0, 0, 20, 20, 180, -90);
region -= QRegion(path.toFillPolygon().toPolygon())
self.setMask(region)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.resize(500,500)
win.show()
sys.exit(app.exec_())
1.2 通过自定义窗体类实现窗口圆角
如果您不想通过 QSS 来实现窗口圆角,也可以通过自定义窗体类来实现。
- 自定义窗体类,重写
paintEvent
,并在其中实现绘制圆角矩形的画法。 - 然后在主窗口中创建该窗口类,并通过 setCentralWidget 来设置当前窗口的内容。
下面是一个简单的示例代码,同样可以实现左上角和右下角为圆角矩形的效果。
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget
from PyQt5.QtGui import QPainter, QBrush, QPen
from PyQt5.QtCore import Qt, QRect, QPoint, QSize
class CustomWidget(QWidget):
def __init__(self, parent=None):
super(CustomWidget, self).__init__(parent)
self.setGeometry(0, 0, 300, 300)
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHint(QPainter.Antialiasing)
# 画圆角矩形
path = QPainterPath()
path.moveTo(10, 0)
path.lineTo(self.width()-10, 0)
path.arcTo(self.width()-20, 0, 20, 20, 0, 90);
path.lineTo(self.width(), self.height()-10)
path.arcTo(self.width()-20, self.height()-20, 20, 20, 0, -90);
path.lineTo(10, self.height())
path.arcTo(0, self.height()-20, 20, 20, 90, -90);
path.lineTo(0, 20)
path.arcTo(0, 0, 20, 20, 180, -90);
painter.setBrush(QBrush(QColor(255, 255, 255, 200)))
painter.setPen(QPen(Qt.transparent))
painter.drawPath(path)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setCentralWidget(CustomWidget(self))
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.resize(500,500)
win.show()
sys.exit(app.exec_())
2. 设置窗口阴影
对于 pyqt5 的窗口阴影,一般是通过在主窗口中设置一个 QGraphicsDropShadowEffect 来实现。
下面是一个简单的示例代码,实现左侧有阴影的效果。
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QFrame
from PyQt5.QtGui import QPainterPath, QPainter, QColor, QPen, QBrush
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPalette
from PyQt5.QtWidgets import QVBoxLayout, QGridLayout, QLabel
from PyQt5.QtGui import QPixmap, QCursor, QMouseEvent, QBitmap, QRegion
from PyQt5.QtGui import QGraphicsDropShadowEffect
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
# 创建要加阴影的控件
frame = QFrame(self)
frame.setAutoFillBackground(True)
# 设置阴影
shadow = QGraphicsDropShadowEffect(frame)
shadow.setBlurRadius(5)
shadow.setXOffset(0)
shadow.setYOffset(0)
shadow.setColor(QColor(0, 0, 0, 80))
frame.setGraphicsEffect(shadow)
# 设置控件的样式
frame.setFixedSize(200,250)
pal = QPalette()
pal.setColor(QPalette.Background, Qt.white)
frame.setPalette(pal)
self.setCentralWidget(frame)
if __name__ == '__main__':
app = QApplication(sys.argv)
win = MainWindow()
win.resize(500,500)
win.show()
sys.exit(app.exec_())
好了,以上就是“pyqt5 设置窗口圆角及阴影的操作”的完整攻略,希望对你有帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pyqt5 设置窗口圆角及阴影的操作 - Python技术站