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 map和reduce函数用法示例
Feb 26 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
Python使用logging模块实现打印log到指定文件的方法
Sep 05 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
django页面跳转问题及注意事项
Jul 18 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
python实现自动清理重复文件
Aug 24 Python
彻底解决Python包下载慢问题
Nov 15 Python
Python基本的内置数据类型及使用方法
Apr 13 Python
python manim实现排序算法动画示例
Aug 14 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
PHP 已经成熟
2006/12/04 PHP
解析php中heredoc的使用方法
2013/06/17 PHP
php通过数组实现多条件查询实现方法(字符串分割)
2014/05/06 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
2015/04/15 PHP
PHP实现的XML操作类【XML Library】
2016/12/29 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
jQuery load方法用法集锦
2011/12/06 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
js监听键盘事件示例代码
2013/07/26 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
vue和webpack打包项目相对路径修改的方法
2018/06/15 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
js实现一个简易计算器
2020/03/30 Javascript
Node.js API详解之 assert模块用法实例分析
2020/05/26 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
pygame游戏之旅 python和pygame安装教程
2018/11/20 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
详解Python中is和==的区别
2019/03/21 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
python装饰器的特性原理详解
2019/12/25 Python
使用PyTorch训练一个图像分类器实例
2020/01/08 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
平面设计自荐信
2013/10/07 职场文书
物理分数没达标检讨书
2014/09/13 职场文书
践行党的群众路线心得体会
2014/11/05 职场文书
应届毕业生求职信范文
2015/03/19 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
花田少年史观后感
2015/06/16 职场文书
五年级数学教学反思
2016/02/16 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
SpringBoot2 参数管理实践之入参出参与校验的方式
2021/06/16 Java/Android