一、自定义窗口演练鼠标和窗口事件
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.setWindowTitle('窗口案例')
self.resize(600, 500)
self.mouse_press = False
self.btn_w = 60
self.btn_h = 30
self.func_list()
def func_list(self) :
self.btn()
def btn(self) :
self.close_btn = QPushButton(self)
self.close_btn.setText('关闭')
self.close_btn.resize(self.btn_w, self.btn_h)
self.max_btn = QPushButton(self)
self.max_btn.setText('最大化')
self.max_btn.resize(self.btn_w, self.btn_h)
self.min_btn = QPushButton(self)
self.min_btn.setText('最小化')
self.min_btn.resize(self.btn_w, self.btn_h)
self.close_btn.pressed.connect(self.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)
def mousePressEvent(self, QMouseEvent) :
if QMouseEvent.button() == Qt.LeftButton :
self.mouse_press = True
self.win_x = self.x()
self.win_y = self.y()
self.m_x = QMouseEvent.globalX()
self.m_y = QMouseEvent.globalY()
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
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
3.演示效果

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现