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中,使用font-family属性来控制字体的样式。比如我们可以设置字体为宋体: p { font-family: SimSun; } 同时,font-size属性可以用来设置字体的大小: p { font-size: 16px; } 字体边框 Css还提…

    css 2023年6月10日
    00
  • CodeMirror js代码加亮使用总结

    CodeMirror js代码加亮使用总结 CodeMirror是一款非常优秀的js代码编辑器,它支持语法高亮、自动补全、括号匹配、多种主题、多语言支持等功能,是非常适合在Web开发中使用的代码编辑器。 安装 CodeMirror的安装非常容易,你可以在CodeMirror官网下载它的各个版本,也可以使用npm进行安装。 npm install codemi…

    css 2023年6月9日
    00
  • CSS自定义select下拉选择框的样式(不用其他标签模拟)

    下面是关于“CSS自定义select下拉选择框的样式”的攻略: 1. 原生select样式覆盖 使用原生的select标签进行下拉菜单功能开发时,为了美观和更好的用户体验,我们通常会对其样式进行美化。但是,由于原生的select样式是很难被覆盖的,所以我们需要使用一些特殊技巧和CSS技巧进行样式覆盖。 1.1 隐藏原生select的样式 首先,我们需要将原生…

    css 2023年6月10日
    00
  • 原生javascript实现读写CSS样式的方法详解

    原生JavaScript实现读写CSS样式的方法详解 CSS样式可以通过JavaScript动态地进行修改和设置,而这些操作也被称作DOM样式操作。在本文中,我将详细讲解原生JavaScript实现读写CSS样式的方法。 1. 通过style属性读写CSS属性 通过元素的style属性可以获取或修改该元素的行内样式。行内样式是直接写在HTML标签中的样式,优…

    css 2023年6月10日
    00
  • 用css给tbody加垂直滚动条的具体思路及样式代码

    给 tbody 元素添加垂直滚动条是一个常见需求,可以通过以下步骤实现: 设置最外层容器的高度:首先,我们需要确定外层容器的高度。一般情况下,我们可以将其设置为固定高度或相对于视口高度的百分比值。 示例代码: .container { height: 400px; /*设置容器高度*/ } 给 tbody 设置高度和 overflow-y: auto:接着,…

    css 2023年6月10日
    00
  • 使用HTML+CSS+JS制作简单的网页菜单界面

    使用HTML、CSS和JS制作简单的网页菜单界面可以通过以下步骤来完成: 编写HTML结构 在HTML中,可以使用ul和li标签来创建菜单列表,并将其包围在nav标签中,代码示例如下: <nav> <ul> <li><a href="#">首页</a></li> &l…

    css 2023年6月10日
    00
  • webpack里使用jquery.mCustomScrollbar插件的方法

    当在webpack中引入jquery.mCustomScrollbar插件时,需要进行一些特殊处理。以下是详细的步骤: 1. 安装jQuery和jQuery.mCustomScrollbar插件 首先,在项目中安装需要使用到的jQuery库和jQuery.mCustomScrollbar插件。可以通过npm安装,执行以下命令: npm install jqu…

    css 2023年6月10日
    00
  • CSS实现移动端横向滚动导航条(PC端也适用)

    下面是关于CSS实现移动端横向滚动导航条的完整攻略。 1.确定HTML结构 首先,在HTML中确定导航条的结构。我们可以使用一个父元素作为导航条,子元素表示每一个具体的菜单选项。例如: <div class="nav"> <a href="#">菜单1</a> <a href=…

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