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读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
python 基础教程之Map使用方法
Jan 17 Python
利用aardio给python编写图形界面
Aug 21 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
python3+PyQt5实现柱状图
Apr 24 Python
查看python下OpenCV版本的方法
Aug 03 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
Django之使用内置函数和celery发邮件的方法示例
Sep 16 Python
python 有效的括号的实现代码示例
Nov 11 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
Python是怎样处理json模块的
Jul 16 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/10/09 PHP
PHP中static关键字原理的学习研究分析
2011/07/18 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
php检测mysql表是否存在的方法小结
2017/07/20 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
javascript数组使用调用方法汇总
2007/12/08 Javascript
用JavaScript隐藏控件的方法
2009/09/21 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
2010/12/28 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
2015/08/31 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
python+pandas分析nginx日志的实例
2018/04/28 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
Selenium元素的常用操作方法分析
2018/08/10 Python
Python3.5运算符操作实例详解
2019/04/25 Python
python如何通过twisted搭建socket服务
2020/02/03 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
html5 css3网站菜单实现代码
2013/12/23 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
美国最大的在线生存商店:Survival Frog
2020/12/13 全球购物
学生喝酒检讨书
2014/02/06 职场文书
中国好声音广告词
2014/03/18 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2014年手术室工作总结
2014/11/26 职场文书
工作感言一句话
2015/08/01 职场文书
2019年市场部个人述职报告(三篇)
2019/10/23 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
python 单机五子棋对战游戏
2022/04/28 Python