python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例


Posted in Python onFebruary 25, 2020

窗口背景主要包括,背景色与背景图片,设置窗口背景有三种方法

  • 使用QSS设置窗口背景
  • 使用QPalette设置窗口背景
  • 实现PainEvent,使用QPainter绘制背景

QSS设置窗口背景

在QSS中,我们可以使用Background或者background-color的方式来设置背景色,设置窗口背景色之后,子控件默认会继承父窗口的背景色,如果想要为控件设置背景图片或图标,则可以使用setPixmap或则setIcon来完成。关于这两个函数的用法,可以参考本博客下的PyQt5的基础控件分栏

实例:QSS设置窗口背景

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication

app = QApplication(sys.argv)
win = QMainWindow()

#设置窗口标题与初始大小
win.setWindowTitle("界面背景图片设置")
win.resize(350, 250)
#设置对象名称
win.setObjectName("MainWindow")

# #todo 1 设置窗口背景图片
win.setStyleSheet("#MainWindow{border-image:url(./images/python.jpg);}")

#todo 2 设置窗口背景色
#win.setStyleSheet("#MainWindow{background-color: yellow}")

win.show()
sys.exit(app.exec_())

运行效果图如下

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

核心代码如下

#设置对象名称
win.setObjectName("MainWindow")

# #todo 1 设置窗口背景图片
win.setStyleSheet("#MainWindow{border-image:url(./images/python.jpg);}")

优化 使用setStyleSheet()设置窗口背景色,核心代码和效果图如下

#todo 2 设置窗口背景色
win.setStyleSheet("#MainWindow{background-color: yellow}")

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

QPalette设置窗口背景

当使用QPalette(调试板)来设置背景图片时,需要考虑背景图片的尺寸

图片尺寸可以文件管理器打开,右键属性查看

当背景图片的宽度高度大于窗口的宽度高度时,背景图片会平铺整个背景

当背景图片宽度高度小于窗口的宽度高度时,则会加载多个背景图片

实例:QPalette设置窗口背景

import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtGui import QPalette, QBrush, QPixmap

app = QApplication(sys.argv)
win = QMainWindow()

win.setWindowTitle("界面背景图片设置")
palette = QPalette()
palette.setBrush(QPalette.Background, QBrush(QPixmap("./images/python.jpg")))
win.setPalette(palette)

# todo 1 当背景图片的宽度和高度大于窗口的宽度和高度时
win.resize(460, 255 )
#
# # todo 2 当背景图片的宽度和高度小于窗口的宽度和高度时
# win.resize(800, 600)
win.show()
sys.exit(app.exec_())

当背景图片的宽度高度大于窗口的宽度高度时,背景图片会平铺整个背景

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

当背景图片宽度高度小于窗口的宽度高度时,则会加载多个背景图片

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

核心代码如下

win.setWindowTitle("界面背景图片设置")
palette = QPalette()
palette.setBrush(QPalette.Background, QBrush(QPixmap("./images/python.jpg")))
win.setPalette(palette)

# todo 1 当背景图片的宽度和高度大于窗口的宽度和高度时
win.resize(460, 255 )
#
# # todo 2 当背景图片的宽度和高度小于窗口的宽度和高度时
# win.resize(800, 600)

PaintEvent设置窗口背景

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPainter,QPixmap
from PyQt5.QtCore import Qt


class Winform(QWidget):
  def __init__(self, parent=None):
    super(Winform, self).__init__(parent)
    self.setWindowTitle("paintEvent设置背景颜色")

  def paintEvent(self, event):
    painter = QPainter(self)
    #todo 1 设置背景颜色
    painter.setBrush(Qt.green)
    painter.drawRect(self.rect())

    # #todo 2 设置背景图片,平铺到整个窗口,随着窗口改变而改变
    # pixmap = QPixmap("./images/screen1.jpg")
    # painter.drawPixmap(self.rect(), pixmap)


if __name__ == "__main__":
  app = QApplication(sys.argv)
  form = Winform()
  form.show()
  sys.exit(app.exec_())

核心代码:使用paintEvent设置窗口的背景色

class Winform(QWidget):
  def __init__(self, parent=None):
    super(Winform, self).__init__(parent)
    self.setWindowTitle("paintEvent设置背景颜色")

  def paintEvent(self, event):
    painter = QPainter(self)
    #todo 1 设置背景颜色
    painter.setBrush(Qt.green)
    painter.drawRect(self.rect())

效果如图

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

核心代码:设置窗口背景图片

# #todo 2 设置背景图片,平铺到整个窗口,随着窗口改变而改变
pixmap = QPixmap("./images/screen1.jpg")
painter.drawPixmap(self.rect(), pixmap)

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

QWidget类中比较重要的绘图函数如表所示

函数 描述
setMask(self,QBitmap)setMask(self,QRegion) setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的,它的参数可以为QBitmap或QRegion对象,此处调用QPixmap的mask()函数获得图片自身的遮罩,是一个QBitmap对象,在实例中使用的是PNG格式的图片,它的透明部分就是一个遮罩
paintEvent(self,QPaintEvent) 通过重载paintEvent()函数绘制窗口背景

不规则窗口实例 1

实现不规则窗口的最简单方式就是图片素材不仅当遮罩层,还当背景图片,通过重载paintEvent()函数绘制窗口背景

import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPixmap,QPainter,QBitmap

class MyForm(QWidget):
  def __init__(self,parent=None):
    super(MyForm, self).__init__(parent)
    #设置标题与初始窗口大小
    self.setWindowTitle('不规则窗口的实现例子')
    self.resize(560,390)

  def paintEvent(self, QPaintEvent):
    painter=QPainter(self)
    #在指定位置绘制图片
    painter.drawPixmap(0,0,280,390,QPixmap(r'./images/dog.jpg'))
    painter.drawPixmap(280,0,280,390,QBitmap(r'./images/dog.jpg'))
if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=MyForm()
  form.show()
  sys.exit(app.exec_())

运行效果如下

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

不规则窗口实例 2

使用两张图片,一张用来做遮罩来控制窗口的大小,然后在利用paintEvent()函数重绘另一张为窗口的背景图。

import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPixmap,QPainter,QBitmap

class MyForm(QWidget):
  def __init__(self,parent=None):
    super(MyForm, self).__init__(parent)
    #设置标题与初始窗口大小
    self.setWindowTitle('不规则窗口的实现例子')

    self.pix=QBitmap('./images/mask.png')
    self.resize(self.pix.size())
    self.setMask(self.pix)

  def paintEvent(self, QPaintEvent):
    painter=QPainter(self)
    #在指定位置绘制图片
    painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap(r'./images/screen1.jpg'))

if __name__ == '__main__':
  app=QApplication(sys.argv)
  form=MyForm()
  form.show()
  sys.exit(app.exec_())

运行效果如下

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

可以拖动的不规则窗口实例

第二个窗口的实例是不可以拖动的,这里实现可以拖动的功能

import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPixmap, QPainter, QCursor, QBitmap
from PyQt5.QtCore import Qt


class ShapeWidget(QWidget):
  def __init__(self, parent=None):
    super(ShapeWidget, self).__init__(parent)
    self.setWindowTitle("不规则的,可以拖动的窗体实现例子")
    self.mypix()

  # 显示不规则 pix
  def mypix(self):
    #获得图片自身的遮罩
    self.pix = QBitmap("./images/mask.png")
    #将获得的图片的大小作为窗口的大小
    self.resize(self.pix.size())
    #增加一个遮罩
    self.setMask(self.pix)
    #print(self.pix.size())
    self.dragPosition = None

  # 重定义鼠标按下响应函数mousePressEvent(QMouseEvent)
  # 鼠标移动响应函数mouseMoveEvent(QMouseEvent),使不规则窗体能响应鼠标事件,随意拖动。
  def mousePressEvent(self, event):
    #鼠标左键按下
    if event.button() == Qt.LeftButton:
      self.m_drag = True
      self.m_DragPosition = event.globalPos() - self.pos()
      event.accept()
      self.setCursor(QCursor(Qt.OpenHandCursor))
    if event.button() == Qt.RightButton:
      self.close()

  def mouseMoveEvent(self, QMouseEvent):
    if Qt.LeftButton and self.m_drag:
      # 当左键移动窗体修改偏移值
      self.move(QMouseEvent.globalPos() - self.m_DragPosition)
      QMouseEvent.accept()

  def mouseReleaseEvent(self, QMouseEvent):
    self.m_drag = False
    self.setCursor(QCursor(Qt.ArrowCursor))

  # 一般 paintEvent 在窗体首次绘制加载, 要重新加载paintEvent
  # 需要重新加载窗口使用 self.update() or self.repaint()
  def paintEvent(self, event):
    painter = QPainter(self)
    #在指定位置绘制图片
    painter.drawPixmap(0, 0, self.width(), self.height(), QPixmap("./images/boy.png"))


if __name__ == '__main__':
  app = QApplication(sys.argv)
  form = ShapeWidget()
  form.show()
  app.exec_()

运行效果如下

python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例

本文主要介绍了python GUI库PyQt5窗口背景与不规则窗口实例,大家可以参考下,更多关于这方面的文章大家可以点击下面的相关链接

Python 相关文章推荐
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
python树的同构学习笔记
Sep 14 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
使用Keras画神经网络准确性图教程
Jun 15 Python
python 开心网和豆瓣日记爬取的小爬虫
May 29 Python
python统计函数库scipy.stats的用法解析
Feb 25 #Python
Python Websocket服务端通信的使用示例
Feb 25 #Python
Python GUI库PyQt5样式QSS子控件介绍
Feb 25 #Python
浅谈python累加求和+奇偶数求和_break_continue
Feb 25 #Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 #Python
python 伯努利分布详解
Feb 25 #Python
Python3如何在Windows和Linux上打包
Feb 25 #Python
You might like
香妃
2021/03/03 冲泡冲煮
Nginx下配置codeigniter框架方法
2015/04/07 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
php生成静态页面并实现预览功能
2019/06/27 PHP
JS获取IUSR_机器名和IWAM_机器名帐号的密码
2006/12/06 Javascript
jquery实现文本框鼠标右击无效以及不能输入的代码
2010/11/05 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
React Native模块之Permissions权限申请的实例相机
2017/09/28 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
python批量实现Word文件转换为PDF文件
2018/03/15 Python
解决python 输出是省略号的问题
2018/04/19 Python
python取数作为临时极大值(极小值)的方法
2018/10/15 Python
Python Flask框架模板操作实例分析
2019/05/03 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
20行python代码实现人脸识别
2019/05/05 Python
美国汽车交易网站:Edmunds
2016/08/17 全球购物
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
党员个人思想汇报
2013/12/28 职场文书
安全大检查反思材料
2014/01/31 职场文书
药品业务员岗位职责
2014/04/17 职场文书
禁烟标语大全
2014/06/11 职场文书
简单通用的简历自我评价
2014/09/21 职场文书
违纪检讨书
2015/01/27 职场文书
学校百日安全活动总结
2015/05/07 职场文书
亲戚关系证明
2015/06/24 职场文书
Python调用腾讯API实现人脸身份证比对功能
2022/04/04 Python
SpringBoot集成MongoDB实现文件上传的步骤
2022/04/18 MongoDB