PyQt5 不规则窗口的显示

news2024/11/25 5:03:55

PyQt5 不规则窗口的显示

  • QPixmap和QBitmap绘图的效果对比
  • 不可以拖动的不规则窗口
  • 可以拖动的不规则窗口
  • 不规则窗口实现动画效果
  • 加载GIF动画效果

函数描述
setMask(self, QBitmap)
setMask(self, QRegion)
setMask()的作用是为调用它的控件增加一个遮罩,遮住所选区域以外的部分,使之看起来是透明的。它的参数可以为QBitmap或QRegion对象。
paintEvent(self, QPaintEvent)通过重载paintEvent()函数绘制窗口背景

QPixmap和QBitmap绘图的效果对比

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("不规则窗口的实现例子")

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(0, 0, 280, 390, QPixmap(r"./pyqt5/images/dog.jpg"))
        painter.drawPixmap(300, 0, 280, 390, QBitmap(r"./pyqt5/images/dog.jpg"))

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

在这里插入图片描述

不可以拖动的不规则窗口

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

class WinForm(QWidget):
    def __init__(self, parent=None):
        super(WinForm, self).__init__(parent)
        self.setWindowTitle("不规则窗口的实现例子")

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

    def paintEvent(self, event):
        painter = QPainter(self)
        # 在指定区域直接绘制窗口背景
        painter.drawPixmap(0, 0, self.pix.width(), self.pix.height(), QPixmap("./pyqt5/images/screen1.jpg"))

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

在这里插入图片描述

可以拖动的不规则窗口

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()	

    # 显示不规则 pic
	def mypix(self):
		self.pix = QBitmap( "./pyqt5/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("./pyqt5/images/boy.png"))
			
if __name__ == '__main__':
    app=QApplication(sys.argv)
    form=ShapeWidget()
    form.show()
    app.exec_()

在这里插入图片描述

不规则窗口实现动画效果

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

class ShapeWidget(QWidget):
    def __init__(self, parent=None):
        super(ShapeWidget, self).__init__(parent)
        self.i = 1
        self.mypix()
        self.timer = QTimer()
        self.timer.setInterval(500) # 定时器每500毫秒更新一次
        self.timer.timeout.connect(self.timeChange)
        self.timer.start()

    # 显示不规则图片
    def mypix(self):
        self.update()
        if self.i == 5:
            self.i = 1
        self.mypic = {1:'./pyqt5/images/left.png', 2:'./pyqt5/images/up.png', 3:'./pyqt5/images/right.png', 4:'./pyqt5/images/down.png'}
        self.pix = QPixmap(self.mypic[self.i], "0", Qt.AvoidDither | Qt.ThresholdDither | Qt.ThresholdAlphaDither)
        self.resize(self.pix.size())
        self.setMask(self.pix.mask())
        self.dragPosition = None

    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))

    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))

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(0, 0, self.pix.width(), self.pix.height(), self.pix)

    def mouseDoubleClickEvent(self, event):
        if event.button() == 1:
            self.i += 1
            self.mypix()

    def timeChange(self):
        self.i += 1
        self.mypix()

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

在这里插入图片描述

加载GIF动画效果

import sys
from PyQt5.QtWidgets import QApplication, QLabel, QWidget
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QMovie

class LoadingGifWin(QWidget):
    def __init__(self, parent=None):
        super(LoadingGifWin, self).__init__(parent)
        self.label = QLabel('', self)
        self.setFixedSize(128, 128)        
        self.setWindowFlags(Qt.Dialog | Qt.CustomizeWindowHint)
        self.movie = QMovie("./pyqt5/images/loading.gif")
        self.label.setMovie(self.movie)
        self.movie.start()
        
if __name__ == "__main__":
    app = QApplication(sys.argv)
    win = LoadingGifWin()
    win.show()
    sys.exit(app.exec_())

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android App】实战项目之仿微信的附近的人(附源码和演示 超详细)

需要全部源码请点赞关注收藏后评论区留言私信~~~ 艺术家常说“距离产生美”,其实距离近才是优势,谁不希望自己的工作事少钱多离家近呢?不光是工作,像租房买房、恋爱交友,大家都希望找个近点的,比如58、赶集…

【react-笔记】

目录简介基本使用虚拟dom的两种创建方法jsx语法规则模块与组件、模块化和组件化的理解模块组件模块化组件化函数式组件类式组件组件实例三大属性statepropsrefs事件处理包含表单的组件分类非受控组件受控组件高阶函数_函数的柯里化生命周期引出生命周期理解生命周期(旧)总结新的…

Verilog 延迟反标注

延迟反标注, SDF 延迟反标注是设计者根据单元库工艺、门级网表、版图中的电容电阻等信息,借助数字设计工具将延迟信息标注到门级网表中的过程。利用延迟反标注后的网表,就可以进行精确的时序仿真,使仿真更接近实际工作的数字电路…

当MySQL想恋爱,java和navicate抢着做媒婆 ------ java连接MySQL数据库 navicat for MySQL 连接

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 **收录于专栏 数据库 ⭐当MySQL和java通过媒婆navicate谈上了恋爱⭐ 文章目录⭐当MySQL和java通过媒婆navicate谈上了恋爱…

Linux 多线程

目录 一.线程概念 1.什么是线程 2.页表 (1)页表结构 (2)好处 3.线程优点 4.线程缺点 5.线程异常 6.线程用途 7.进程和线程的 8.简单使用线程 二.线程控制 1.使用线程 2.线程栈和pthread_t 3.线程的局部存储 4.分离…

[附源码]计算机毕业设计springboot室内设计类网站

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

R语言中的划分聚类模型

划分聚类 是用于基于数据集的相似性将数据集分类为多个组的聚类方法。我们围绕聚类技术进行一些咨询,帮助客户解决独特的业务问题。 【视频】KMEANS均值聚类和层次聚类:R语言分析生活幸福质量系数可视化实例 KMEANS均值聚类和层次聚类:R语言分…

GUI自动化测试工具Sikulix的安装和使用

从程序内部控制对小白来说太难了,所以使用一下自动化测试的工具直接控制按钮达到我的目的 一个比较好的自动化测试工具是Sikulix,这里记录一下安装和基本的使用 下载和安装 官网:http://www.sikulix.com/ 下载对应系统的.jar需要使用java&…

第二证券|A股集体收涨,汽车产业链爆发!房地产延续强势

11月30日早盘,A股三大指数小幅上行。到午间收盘,沪指涨0.21%报3156.50点,深成指涨0.38%,创业板指涨0.20%;两市算计成交5692亿元。 盘面上看,轿车、燃气、地产、油气、煤炭等板块走强,酒店餐饮、…

实验室信息化建设的意义

实验室信息管理系统将实验室的仪器设备、实验人员、实验环境以及相关数据进行集成和管理,使整个实验室形成一个有机整体,规范了业务流程和管理体制,实现各部门之间资源共享协同作业,达到优化配置资源和提高工作效率,不…

欧洲肿瘤生物学博士后申请经历

国外博士后的申请者经常会遇到各种问题,从而感叹申请过程的不易。知识人网小编推荐这篇申请经历,或许会给其他申请者带来一定启示。 作者从今年1月开始申请,5月份获得offer。以下是原文: 背景介绍:国内双非一本生物工…

云开发静态网站H5跳转小程序(记录过程)以及云环境共享(同一主体)

需求:老板要求是在H5网页端,无论是在微信浏览器还是在微信外部浏览器都可以打开这个H5之后,然后跳转到小程序上。 查看了微信相关的文档,发现H5端跳转小程序是有两种方式: 一:微信内网页跳转小程序 官方文档…

【春秋云境】CVE-2022-24124复现

一直不明白updatexml到底要怎么注入 &fieldupdatexml(0,concat(0x7e,(version()),0x7e),0) 确实可以出来版本号 但是如果换成database()还是不行 最后还是靠了大佬 http://eci-2ze625l338u3rfrh3r36.cloudeci1.ichunqiu.com:8000/api/get-organizations?p123&page…

只要让我戴上面具 , 我就会马上逃跑 ! 等下眼镜卡住了

郑重声明 : 本文不包含任何广告 , 不构成任何购买建议 , 我也强烈不建议购买本文这款产品 , 所有图片来自我手机拍照 , 如有侵权 , 通知我 , 马上删除 写在前面 相信各位同学一定都经历过火灾安全知识培训吧 而且肯定有一部分人是那种充当表演对象的上手使用过灭火器的人 除了…

STM32实战总结:HAL之SDIO

在介绍SDIO接口之前先了解一下MMC、SD卡、SD标准等背景知识。 MMC(Multi Media Card):即多媒体卡,它是一种非易失性存储器件,体积小巧,容量大,耗电量低,传输速度快,主要应用于消费类电子产品中&…

D. Social Network(并查集修改连通块数量)

Problem - D - Codeforces 威廉来到了一个专门讨论加密货币的会议。要想了解加密货币世界的最新消息,建立联系、认识新朋友、利用朋友的关系是必不可少的。 会议有N个参与者,他们最初都不熟悉对方。威廉可以把之前不熟悉的任何两个人a和b介绍给对方。 …

spi驱动数码管

spi是串行全双工同步通信,支持多从机模式,没有应答机制,可靠性方面存在劣势; 采用边沿采样,根据时钟极性和时钟相位,有四种数据传输方式(由时钟变化(极性,相位)决定; 因…

Java Tomcat内存马——Listener内存马

目录 (一)前置知识 0x01 什么是Listener 0x02 Listener的简单案例 0x03 Listener流程分析 (二)注入分析 (三)实现内存马 得到完整的内存马 (四)漏洞复现 其他的payload: 总结 (一&#…

Observability:从零开始创建 Java 微服务并监控它 (二)

这篇文章是继上一篇文章 “Observability:从零开始创建 Java 微服务并监控它 (一)” 的续篇。在上一篇文章中,我们讲述了如何创建一个 Java web 应用,并使用 Filebeat 来收集应用所生成的日志。在今天的文章中&#xf…

机器学习3判断机器算法的性能

文章目录一、判断机器算法的性能1基本使用1.目的2.使用pycharm函数封装3.sklearn中的train test split:4.完美调用:二、判断机器算法的性能2分类的准确度(accuracy)准确度初步计算:完善KNNpy程序如下:一、判…