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

yizhihongxing

现在我来详细讲解一下“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 Sprites 圆角制作教程

    CSS Sprites 圆角制作教程 CSS Sprites是一种优化Web页面性能的技术,可以将多个小图片合并成一张大图片,减少HTTP请求次数,从而提高页面加载速度。本攻略将详细讲解如何使用CSS Sprites制作圆角效果,包括基本原理、制作方法和示例说明。 1. 基本原理 CSS Sprites的基本原理是将多个小图片合并成一张大图片,然后使用CSS…

    css 2023年5月18日
    00
  • JavaScript动态插入CSS的方法

    JavaScript动态插入CSS的方法可以通过以下步骤实现: 1. 创建link元素 首先需要创建一个link元素,并设置其rel和href属性,rel属性表示link元素的关系,href属性表示需要插入的CSS文件路径。 <link id="mycss" rel="stylesheet" href=&quot…

    css 2023年6月10日
    00
  • vue中改变滚动条样式的方法

    以下是详细讲解“Vue中改变滚动条样式的方法”的完整攻略。 改变滚动条样式的方法 1. 使用CSS伪元素改变滚动条样式 可以通过给滚动条容器添加如下CSS样式,利用CSS选择器来美化滚动条。 /*滚动条宽度和颜色设置*/ ::-webkit-scrollbar { width: 6px; height: 6px; background-color: #EFE…

    css 2023年6月10日
    00
  • 关于CSS中 星号*的使用介绍

    CSS中星号(*)的使用介绍 星号(*)是CSS中的通配符,它可以应用到任何元素。使用星号可以实现一些非常有用的功能,例如选择某一个元素下的所有子元素或者选择所有元素。 选择所有元素 如果要给所有元素添加通用的样式,可以使用星号通配符,如下所示: * { margin: 0; padding: 0; } 这将把所有元素的外边距和内边距都设置为0,这是很多网站…

    css 2023年6月10日
    00
  • Bootstrap打造一个左侧折叠菜单的系统模板(一)

    我来详细讲解一下”Bootstrap打造一个左侧折叠菜单的系统模板(一)”的完整攻略。此文章的攻略包含以下三部分: 1. 准备工作 在编写左侧折叠菜单前,需要先引入Bootstrap框架。打开网页http://getbootstrap.com/并按照引导指示下载所需文件即可。同时,该模板基于jQuery,所以也需要在页面中引入jQuery库: <!–…

    css 2023年6月9日
    00
  • WEB标准学习,认识两种网页声明的含义

    一、WEB标准学习 WEB标准是基于W3C组织推出的一系列标准化的技术规范,包括HTML、CSS、XML、JavaScript等各种技术标准,旨在为开发者提供规范的技术规范,提高网站的可访问性、可用性、可维护性和可扩展性。 二、认识两种网页声明的含义 HTML 4.01 doctype 声明 HTML 4.01 doctype 声明是指在 HTML 4.01…

    css 2023年6月11日
    00
  • IE7与web标准设计(3)

    IE7与web标准设计是一个非常重要的话题。在IE6时代,许多网页设计者都习惯于使用一些IE6专有的CSS属性和HTML标签来实现一些特定的效果。但这导致网页在非IE6浏览器下的兼容性问题严重,也使得整个web对标准的支持受到限制。随着IE7的出现,微软开始认真推动web标准的实现,导致IE7对于许多IE6专有的属性和标签的支持度有所下降。因此,为了让网页在…

    css 2023年6月9日
    00
  • HTML+CSS+JS实现的简单应用小案例分享

    让我来为大家分享一下“HTML+CSS+JS实现的简单应用小案例”的攻略。 一、准备工作: 在开始实现之前,需要先做好一些准备工作,包括基础知识的掌握、开发工具的准备等。 1.掌握基础知识 HTML:了解 HTML 标签的基本使用方法,掌握常用标签和属性的含义; CSS:掌握 CSS 的基础语法和常用属性; JavaScript:了解 JavaScript …

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