• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
阿甘cx1982 显示全部楼层 发表于 2021-10-26 12:23:08 |阅读模式 打印 上一主题 下一主题
pyqt5 设置窗口圆角及阴影

效果:

代码如下:

创建一个 圆角边框的类,让后直接继承就行
  1. from PyQt5.QtWidgets import *
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. class RoundShadow(QWidget):
  5. """圆角边框类"""
  6. def __init__(self, parent=None):
  7.   super(RoundShadow, self).__init__(parent)
  8.   self.border_width = 8
  9.   # 设置 窗口无边框和背景透明 *必须
  10.   self.setAttribute(Qt.WA_TranslucentBackground)
  11.   self.setWindowFlags(Qt.FramelessWindowHint | Qt.Window)
  12. def paintEvent(self, event):
  13.   # 阴影
  14.   path = QPainterPath()
  15.   path.setFillRule(Qt.WindingFill)
  16.   pat = QPainter(self)
  17.   pat.setRenderHint(pat.Antialiasing)
  18.   pat.fillPath(path, QBrush(Qt.white))
  19.   color = QColor(192, 192, 192, 50)
  20.   for i in range(10):
  21.    i_path = QPainterPath()
  22.    i_path.setFillRule(Qt.WindingFill)
  23.    ref = QRectF(10-i, 10-i, self.width()-(10-i)*2, self.height()-(10-i)*2)
  24.    # i_path.addRect(ref)
  25.    i_path.addRoundedRect(ref, self.border_width, self.border_width)
  26.    color.setAlpha(150 - i**0.5*50)
  27.    pat.setPen(color)
  28.    pat.drawPath(i_path)
  29.   # 圆角
  30.   pat2 = QPainter(self)
  31.   pat2.setRenderHint(pat2.Antialiasing) # 抗锯齿
  32.   pat2.setBrush(Qt.white)
  33.   pat2.setPen(Qt.transparent)
  34.   rect = self.rect()
  35.   rect.setLeft(9)
  36.   rect.setTop(9)
  37.   rect.setWidth(rect.width()-9)
  38.   rect.setHeight(rect.height()-9)
  39.   pat2.drawRoundedRect(rect, 4, 4)
  40. class TestWindow(RoundShadow, QWidget):
  41. """测试窗口"""
  42. def __init__(self, parent=None):
  43.   super(TestWindow, self).__init__(parent)
  44.   self.resize(300, 300)
  45.   
  46. if __name__ == '__main__':
  47. app = QApplication(sys.argv)
  48. t = TestWindow()
  49. # t = RoundImage('./Asset/new_icons/close.png')
  50. t.show()
  51. app.exec_()
复制代码
补充:用pyqt绘制一个无边框、有阴影、带图片背景的(伪顶层)圆角窗口
对象:(要设置的只有Form和widget)
widget在Form内,紧贴着Form,之间隔着Form的layoutMargin(边沿)的宽度:

对象Form的结构(边沿)设置:

对象widget的结构(边沿)设置:

思绪:

起首先交代:
无边框用:
  1. self.setWindowFlag(Qt.FramelessWindowHint)
复制代码
阴影用:
  1. QGraphicsDropShadowEffect
复制代码
设置图片背景用:
  1. self.widget.setStyleSheet("QWidget#widget{background-image: url(./231.png);border-radius:30px;}")
复制代码
至于为什么用setStyleSheet来设置图片背景,我来表明一下,起首绘制图片背景有三个方法,
1、直接在widget上设置(我选择这个方法,虽然圆角还是有一点点锯齿)
  1. self.widget.setStyleSheet("QWidget#widget{background-image: url(./231.png);border-radius:30px;}")
复制代码
用border-radius:30px;来画出圆角
2、用QPalette在widget上绘制出背景图(无法画出圆角):
  1. self.widget.setAutoFillBackground(True) #一定要加上
  2. palette=QPalette()
  3. palette.setBrush(QPalette.Background, QBrush(QPixmap("F:\背景图.png")));
  4. self.widget.setPalette(palette)
复制代码
注意:如果不需要绘制圆角的话,我以为本方法是绘制背景图的首选,但要注意,必须先写上面四句再用self.setStyleSheet(str)加载qss或css
3、重写paintEvent函数时,用QPainter来绘制widget上的背景图(圆角很完善,但是无法加载背景图,大概是我比力菜):
  1. def paintEvent(self, QPaintEvent):
  2.   painter=QPainter(self);
  3.   painter.setPen(Qt.NoPen);
  4.   brush=QBrush()
  5.   brush.setTextureImage(QImage("F:\大创项目\\231.png")) # brush来加载背景图
  6.   painter.setBrush(brush) # painter来加载brush
  7.   painter.setRenderHint(QPainter.Antialiasing) # 抗锯齿化,如果不加的话,圆角的会有锯齿
  8.   painter.drawRoundedRect( 0, 0, self.width() - 1, self.height() - 1, 20, 20); #圆角设置
复制代码
注意:QPainter只能在paintEvent函数中使用,要不然会直接报错,原因是为了规范UI绘制的序次。
步调如下:

一、
  1. self.setAttribute(Qt.WA_TranslucentBackground) #将Form设置为透明
  2. self.setWindowFlag(Qt.FramelessWindowHint) #将Form设置为无边框
复制代码
二、
  1. self.shadow=QGraphicsDropShadowEffect()
  2. self.shadow.setBlurRadius(10)
  3. self.shadow.setColor(QColor(0, 0, 0, 500))
  4. self.shadow.setOffset(6,6)
  5. self.widget.setGraphicsEffect(self.shadow)
复制代码
用QGraphicsDropShadowEffect将widget设置阴影,如许widget就能在已经透明的Form的边沿上留下阴影
三、
  1. self.widget.setStyleSheet("QWidget#widget{background-image: url(./231.png);border-radius:30px;}")
复制代码
注意:
Form的边沿设置一定需要设置layoutMargin的,不然Form连边沿都没有,widget怎么能留下阴影

效果如下(这是我项目做的demo,别给我吐槽色调,还没做完(#手动滑稽)):

以上为个人经验,渴望能给各人一个参考,也渴望各人多多支持脚本之家。如有错误或未思量完全的地方,望不吝赐教。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作