目录
一.实现不规则窗口(异形窗口)
通过mask实现异形窗口
需要一张透明的png图,透明部分被扣出,形成一个非矩形的区域
代码:
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class AbnormityWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("异形窗口")
self.pix = QBitmap('../picture/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('../picture/images/screen1.jpg'))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = AbnormityWindow()
form.show()
sys.exit(app.exec_())
运行结果:
可见窗口成了掩膜的形状。
掩膜图片: 窗口图片:
运行出的窗口:
二.移动和关闭不规则窗口(异形窗口)
pyqt5中的坐标系
代码:
结合代码看移动距离
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
class AbnormityWindow(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("异形窗口")
self.pix = QBitmap('../picture/images/mask.png')
self.resize(self.pix.size())
self.setMask(self.pix)
#鼠标按下
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
#鼠标按下或抬起标志位
self.m_drag = True
#当前单击点相对于窗口本身的坐标,永远是正的
self.m_DragPosition = event.globalPos() - self.pos()
#print(self.m_DragPosition)
#设置光标形状
self.setCursor(QCursor(Qt.OpenHandCursor))
'''
# 当前单击点相对于屏幕的坐标,包括标题栏和边框
print(event.globalPos())
# 当前单击点相对于窗口的坐标,忽略标题栏和边框
print(event.pos())
'''
# 左上角坐标相对于屏幕的坐标,包括标题栏和边框
print(self.pos())
#按下右键
if event.button() == Qt.RightButton:
self.close()
#鼠标移动
def mouseMoveEvent(self, QMouseEvent):
if Qt.LeftButton and self.m_drag:
# 当左键移动窗体修改偏移值
# QPoint
'''
实时计算窗口左上角坐标,注意是左上角!!!!!!
这个移动是从上次的窗口位置往现在到达的位置移动,
所以是现在的globalPos()减去移动之前的单击点到窗口边框的距离,就是当前左上角坐标
'''
self.move(QMouseEvent.globalPos() - self.m_DragPosition)
#鼠标抬起
def mouseReleaseEvent(self, QMouseEvent):
self.m_drag = False
#cursor(n.)光标
self.setCursor(QCursor(Qt.ArrowCursor))
def paintEvent(self, event):
painter = QPainter(self)
painter.drawPixmap(0,0,self.pix.width(),self.pix.height(),QPixmap('../picture/images/screen1.jpg'))
if __name__ == "__main__":
app = QApplication(sys.argv)
form = AbnormityWindow()
form.show()
sys.exit(app.exec_())
运行结果:
界面和上面一样,就是左键按住可以拖动,单击右键可以关闭窗口。
三. 实现异形窗口动画效果
这块有点绕脑子,我先休息会。
代码:
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QPixmap, QPainter, QCursor
from PyQt5.QtCore import Qt, QTimer
class AnimationWindows(QWidget):
def __init__(self, parent=None):
super(AnimationWindows, 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()
# 显示不规则 pic
def mypix(self):
#通过立即调用paintEvent()来直接重新绘制窗口部件
self.update()
if self.i == 5:
self.i = 1
self.mypic = {1: '../picture/images/left.png', 2: "../picture/images/up.png", 3: '../picture/images/right.png', 4: '../picture/images/down.png'}
self.pix = QPixmap(self.mypic[self.i])
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()
#设置光标形状
self.setCursor(QCursor(Qt.OpenHandCursor))
def mouseMoveEvent(self, QMouseEvent):
if Qt.LeftButton and self.m_drag:
self.move(QMouseEvent.globalPos() - self.m_DragPosition)
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()
# 每500毫秒修改paint,即换一张图
def timeChange(self):
self.i += 1
self.mypix()
if __name__ == '__main__':
app = QApplication(sys.argv)
form = AnimationWindows()
form.show()
sys.exit(app.exec_())
运行结果:
这玩意一直在旋转。自己试试吧。