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背景色镂空技术实际应用及进阶分享

    下面就是一份详细讲解“CSS背景色镂空技术实际应用及进阶分享”的完整攻略: 什么是CSS背景色镂空技术? CSS背景色镂空技术是一种CSS技术,可用于将页面元素的背景色创建为一个镂空区域,使之呈现出“透明”的效果,从而展示出底层元素的背景色或背景图片。要达到这种效果,常见的实现方法是使用伪元素(:before和:after),借助属性content和back…

    css 2023年6月9日
    00
  • 浅谈CSS字体的加载加速问题

    浅谈CSS字体的加载加速问题 CSS字体的加载速度直接影响着网页的性能和用户体验。本攻略将介绍如何优化CSS字体的加载速度,从而提升网页的性能和用户体验。 1. 使用系统默认字体族 系统默认字体族是每台计算机上都默认安装的字体。在CSS中使用这些字体族,不但可以节省加载时间,还可以保证字体的一致性。以下是常用的默认字体族: body { font-famil…

    css 2023年6月9日
    00
  • JavaScript实现音乐导航效果

    JavaScript实现音乐导航效果,可以分为以下步骤: 1. HTML 结构 首先需要准备一个包含音乐链接和对应导航按钮的 HTML 结构,如下所示: <ul id="musicList"> <li> <a href="music1.mp3">Music 1</a> &…

    css 2023年6月10日
    00
  • 使用CSS去掉超链接的虚线边框的方法

    下面是使用CSS去掉超链接的虚线边框的方法的完整攻略: 1. 为什么需要去掉超链接虚线边框 默认情况下,浏览器在渲染超链接时会在超链接周围绘制一个虚线边框。这个虚线边框的作用是给用户提供了一个视觉反馈,让用户知道这是一个超链接。但是,一些设计师或者开发者认为这个虚线边框太过突出,会干扰到网页的整体视觉效果,所以就需要去掉虚线边框。 2. 去掉超链接虚线边框的…

    css 2023年6月10日
    00
  • CSS伪类和伪元素的区别详解

    首先我们需要了解“CSS伪类”和“CSS伪元素”的概念。 什么是CSS伪类? CSS伪类是一种用于选择HTML元素特定状态的CSS选择器。伪类通常以冒号(:)作为开头,常用的伪类有:hover、:active、:focus等。 例如,以下代码将在鼠标经过链接时改变链接文字颜色: a:hover{ color: red; } 什么是CSS伪元素? CSS伪元素…

    css 2023年6月10日
    00
  • Dreamweaver网页怎么制作CSS叠层样式?

    Dreamweaver是一款常用的网页制作工具,可以使用它来制作CSS叠层样式。以下是制作CSS叠层样式的完整攻略: 基本步骤 创建HTML文件:在Dreamweaver中创建一个新的HTML文件,例如: <!DOCTYPE html> <html> <head> <title>网页标题</title&g…

    css 2023年5月18日
    00
  • vue的列表交错过渡实现代码示例

    下面是关于“vue的列表交错过渡实现”的完整攻略。 1. 什么是Vue的列表交错过渡 Vue的列表交错过渡,是指在Vue的过渡动画中,列表中的每一项在进场或退场的时候,会以一种交错的方式完成动画,从而让整个列表看起来更加有趣、生动。 2. 实现Vue的列表交错过渡 实现Vue的列表交错过渡,需要使用Vue组件中的<transition-group&gt…

    css 2023年6月9日
    00
  • css教程:选择合适的、有意义的元素描述内容

    选择合适的、有意义的元素描述内容是CSS在前端开发中的重要指导原则之一。简单来说,就是在HTML代码中选择合适的HTML元素,并使用CSS对其进行样式修饰,从而让页面结构更加清晰、易读、易维护。下面是详细的攻略: 1. 选择合适的HTML元素 在HTML中,我们可以利用各种标签来描述网页的结构和内容,如 、 、 、 等。选择合适的HTML元素可以提高页面的可…

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