4.8 自定义窗口演练鼠标和窗口事件
Posted Trouvaille
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4.8 自定义窗口演练鼠标和窗口事件相关的知识,希望对你有一定的参考价值。
一、自定义窗口演练鼠标和窗口事件
1.案例功能
- 通过一个自定义窗口来实现鼠标事件和窗口事件的演练,课程中也增加了一些QObject中的方法。案例要求是创建一个无边框的窗口,透明度为80%,而且窗口拥有放大,缩小和回复正常大小功能,最后还要支持鼠标拖动功能。这是一个总和案例
2.代码
from PyQt5.Qt import *
import sys
\'\'\'
1.设计一个无边框,透明度为80%的窗口,能自由拖动
2.设计三个控件,最大化,最小化和关闭
\'\'\'
class Window(QWidget) :
def __init__(self, *args, **kwargs) :
super().__init__(*args, **kwargs)
#self.setWindowFlags(Qt.FramelessWindowHint) #无边框
#self.setWindowOpacity(0.9) # 半透明,必须是浮点型
self.setWindowTitle(\'窗口案例\')
self.resize(600, 500) #边框
self.mouse_press = False
# self.move(300, 300)
self.btn_w = 60
self.btn_h = 30
self.func_list()
def func_list(self) :
self.btn()
def btn(self) :
# 2添加最大化、最小化和关闭按钮
self.close_btn = QPushButton(self)
self.close_btn.setText(\'关闭\')
self.close_btn.resize(self.btn_w, self.btn_h) #传递宽和高
#self.close_btn.move(self.width()-self.btn_w,2)#窗口宽度-控件宽度(x轴宽度)2(y轴宽度)随意给的
self.max_btn = QPushButton(self)
self.max_btn.setText(\'最大化\')
self.max_btn.resize(self.btn_w, self.btn_h)
#self.max_btn.move(self.width() - self.btn_w * 2, 2)#需要减去两个
self.min_btn = QPushButton(self)
self.min_btn.setText(\'最小化\')
self.min_btn.resize(self.btn_w, self.btn_h)
#self.min_btn.move(self.width() - self.btn_w * 3, 2)
self.close_btn.pressed.connect(self.close) #关闭功能 用信号pressed连接槽函数close
def max_signal() : #最大化的槽函数
if self.isMaximized() : #最大化 恢复正常
self.showNormal() #变正常
self.max_btn.setText(\'最大化\')#按钮字改变
else : #正常 变最大化
self.showMaximized() #变最大化
self.max_btn.setText(\'恢复\') #按钮字改变
self.max_btn.pressed.connect(max_signal) #信号连接槽函数
self.min_btn.pressed.connect(self.showMinimized) #最小化的功能
#鼠标拖动功能
def resizeEvent(self, QResizeEvent) : #让按钮随着窗口移动 由上面放过来的
self.close_btn.move(self.width() - self.btn_w, 2)
self.max_btn.move(self.width() - self.btn_w*2, 2)
self.min_btn.move(self.width() - self.btn_w*3, 2)
# 1.创建一个标记,用来判定鼠标只有在按下之后才能移动
# 2.窗口的原始坐标
# 3.鼠标按下的坐标
def mousePressEvent(self, QMouseEvent) :
if QMouseEvent.button() == Qt.LeftButton : #当鼠标为左键时移动
self.mouse_press = True # 需要在属性中先定义为False
self.win_x = self.x() #窗口左上角的坐标
self.win_y = self.y() #窗口右上角的坐标
self.m_x = QMouseEvent.globalX()#鼠标按下时所在屏幕坐标
self.m_y = QMouseEvent.globalY()
# if 窗口标记 == True:
# 2.根据鼠标按下的点计算移动量
# 3.根据移动量和窗口的原始坐标得到新坐标
# 4.移动窗口位置
def mouseMoveEvent(self, QMouseEvent) :
if self.mouse_press : #鼠标按下 标记为真
move_x = QMouseEvent.globalX() #鼠标落点坐标 全局坐标
move_y = QMouseEvent.globalY()
xx = move_x - self.m_x #鼠标位置变化量 移动量
yy = move_y - self.m_y
self.move(self.win_x + xx, self.win_y + yy) #窗口坐标+变化量=最新位置
#鼠标松开事件
def mouseReleaseEvent(self, QMouseEvent) :
self.mouse_press = False #标记再标为False
# 1.把mousePressEvent中创建的标记重置为False
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
# 创建一个无边框窗口,透明度设置为80%
# 自定义最大化、最小化和关闭按钮
# 支持拖拽功能
3.演示效果
以上是关于4.8 自定义窗口演练鼠标和窗口事件的主要内容,如果未能解决你的问题,请参考以下文章