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实现的一个p2p文件传输实例
Jun 04 Python
Python中使用语句导入模块或包的机制研究
Mar 30 Python
说一说Python logging
Apr 15 Python
浅谈python中的实例方法、类方法和静态方法
Feb 17 Python
教你学会使用Python正则表达式
Sep 07 Python
Python入门Anaconda和Pycharm的安装和配置详解
Jul 16 Python
Python爬虫:url中带字典列表参数的编码转换方法
Aug 21 Python
python3 使用traceback定位异常实例
Mar 09 Python
python 在threading中如何处理主进程和子线程的关系
Apr 25 Python
Python使用Selenium模拟浏览器自动操作功能
Sep 08 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
Python实现灰色关联分析与结果可视化的详细代码
Mar 25 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/06 PHP
PHP APC缓存配置、使用详解
2014/03/06 PHP
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
laravel利用中间件防止未登录用户直接访问后台的方法
2019/09/30 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
对xmlHttp对象的理解
2011/01/17 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
让人蛋疼的JavaScript语法特性
2014/09/30 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
Python实现批量转换文件编码的方法
2015/07/28 Python
Python subprocess模块详细解读
2018/01/29 Python
python根据list重命名文件夹里的所有文件实例
2018/10/25 Python
Python拼接字符串的7种方法总结
2018/11/01 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
Python选择网卡发包及接收数据包
2019/04/04 Python
python实现五子棋小程序
2019/06/18 Python
django框架模板语言使用方法详解
2019/07/18 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
python实现ping命令小程序
2020/12/28 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
毕业晚会主持词
2014/03/24 职场文书
数控技校生自我鉴定
2014/04/19 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书