pyqt5 设置窗口圆角及阴影的操作

现在我来详细讲解一下“pyqt5 设置窗口圆角及阴影的操作”的完整攻略。

1. 设置窗口圆角

为了设置窗口圆角,很多人可能会选择使用 setStyleSheet 方法。但是,这种方法设置的圆角并不是真正的圆角,而只是使用了显示效果相似的方式去处理。

因此,在这里我将介绍使用 QSS(Qt Style Sheet)与自定义窗体类的方法实现真正的圆角效果。

1.1 通过 QSS 实现窗口圆角

通过在 QSS 中使用 border-radius 属性,可以实现对窗口的圆角控制。具体实现步骤如下:

  • 使用 QWidget 作为基类,创建自定义的 MainWindow 类,并重写其中的 paintEventresizeEvent 方法。
  • 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技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • CSS层叠样式表的层叠是什么意思(自我理解)

    当同一个HTML元素被多个CSS规则应用时,这些规则中一些CSS属性有可能发生冲突,此时就需要经过“层叠”的处理来确定最终的输出值。CSS层叠样式表中的“层叠”指的就是这个过程。 层叠的过程通常从上往下进行,如果两个同级的CSS规则具有相同的优先级,那么后面声明的规则将覆盖先前声明的规则。如果两个CSS规则的优先级不同,那么优先级高的规则将会覆盖优先级低的规…

    css 2023年6月9日
    00
  • JavaScript 事件监听实例代码[兼容IE,firefox] 含注释

    这里为大家详细讲解“JavaScript 事件监听实例代码[兼容IE,firefox] 含注释” 的完整攻略。 1. 事件监听的概念 在 HTML 中,JavaScript 可以接收在页面上发生的事件,如用户单击按钮或者鼠标移动,处理这些事件就需要使用到事件监听器。 在理解事件监听之前,先来介绍一下事件的冒泡和捕获的概念。 1.1 事件的冒泡和捕获 事件冒泡…

    css 2023年6月9日
    00
  • CSS3波浪效果示例(前端必学)

    下面我为大家详细讲解“CSS3波浪效果示例(前端必学)”的完整攻略。 1. 环境准备 首先,我们要准备好编辑器工具,例如Sublime、VSCode等,并且要在电脑上安装好Chrome浏览器。 2. HTML结构 首先,我们先来看一下HTML结构。我们需要一个包含一个<section>标签的HTML文件,代码如下: <!DOCTYPE ht…

    css 2023年6月9日
    00
  • CSS3对图片照片进行边缘模糊处理的实现

    实现CSS3对图片照片进行边缘模糊处理可以通过以下步骤: 1. 在HTML中插入图片 首先需要在HTML文档中插入图片,可以使用img标签,例如: <img src="example.jpg" alt="example"> 2. 使用CSS3的filter属性添加模糊效果 要添加边缘模糊效果,需要使用CSS…

    css 2023年6月10日
    00
  • 使用CSS的position属性控制页面布局的入门教程

    关于使用CSS的position属性控制页面布局,下面是一个完整攻略: 一、什么是position属性 position是CSS的一个布局属性,它可以用来控制元素的定位方式。常见的定位方式有三种:相对定位(relative)、绝对定位(absolute)和固定定位(fixed)。 相对定位是指相对于元素原来的位置进行定位,元素所占的空间始终保留在文档流中,通…

    css 2023年6月9日
    00
  • 详解CSS中的Box Model盒属性的使用

    详解CSS中的Box Model盒属性的使用 什么是Box Model Box Model指的是CSS中盒模型,它用于定义HTML元素的组成部分以及在页面布局中的表现。一个HTML元素的盒模型主要包括以下几个部分: content box (内容区):HTML元素的实际内容,比如文字、图片、视频等等。 padding box (内边距区):与内容区相邻的空白…

    css 2023年6月10日
    00
  • jQuery toggle()设置CSS样式

    jQuery的toggle()方法可以用于切换样式、元素的显示与隐藏等操作。下面将详细讲解如何利用toggle()方法设置CSS样式。 toggle()方法基础使用 toggle()方法用于切换元素的可见性,被选元素隐藏就显示,被选元素显示就隐藏。 $("button").click(function(){ $("p"…

    css 2023年6月10日
    00
  • DOM相关内容速查手册

    请允许我详细讲解“DOM相关内容速查手册”的完整攻略。 1. DOM相关内容速查手册是什么? DOM相关内容速查手册是一份文档,用于储存关于DOM的信息和属性,方便开发人员查阅。手册里面包含了大量的DOM方法、属性以及事件等相关信息,并且还提供了示例,能够快速学习DOM相关的知识。 2. 如何使用DOM相关内容速查手册? 使用手册需要了解手册的目录结构,手册…

    css 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部