PyQt事件机制及其应用

一、实例前置

一个小闹钟应用

创建主窗口类
首先我们创建了一个名为AlarmClock的类,它继承自QMainWindow。这个类将包含我们的GUI组件和逻辑。

from Alarm_clock import Ui_MainWindowclass AlarmClock(QMainWindow):def __init__(self):super().__init__()# 初始化 UIself.ui = Ui_MainWindow()self.ui.setupUi(self)

二、创建UI界面

预先设计好的UI文件Alarm_clock.ui

这里,我们使用pyside6-uic把一个预先设计好的UI文件Alarm_clock.ui转成py格式,然后通过from import导入,这个文件定义了我们的界面布局

三、QtWidgets

在 PyQt 中,QtWidgets是一个非常重要的模块,它提供了大量用于构建图形用户界面(GUI)的部件(Widgets)类。这些部件包括但不限于按钮(QPushButton)、标签(QLabel)、文本框(QLineEdit)、布局管理器(如QVBoxLayoutQHBoxLayout)等,是创建交互式 GUI 应用程序的基础构建块。

①QApplication

QApplication是整个应用程序的核心管理类。它负责管理应用程序的生命周期,包括初始化、事件循环处理、资源管理等诸多关键事务。一个 PyQt 应用程序通常需要创建一个QApplication对象作为起点来启动整个应用程序的运行。

     import sysfrom PyQt6.QtWidgets import QApplicationapp = QApplication(sys.argv)# 在这里可以通过sys.argv来获取命令行参数,并根据参数进行应用程序的初始化设置

②QMainWindow

在 PyQt 中,QMainWindow是一个用于创建主窗口类型应用程序的关键类。它提供了一个完整的框架来构建包含菜单栏、工具栏、状态栏和中心部件等典型布局的主窗口应用程序,为复杂的图形用户界面(GUI)应用程序提供了一种标准的组织结构。

     from PyQt6.QtWidgets import QMainWindow, QApplicationimport sysapp = QApplication(sys.argv)main_window = QMainWindow()main_window.show()sys.exit(app.exec())

四、PyQt时间事件处理

①QTimer

在 PyQt 中,QTimer是一个用于实现定时器功能的类。它允许你在指定的时间间隔后触发一个信号,这个信号可以连接到一个槽函数,从而实现周期性的操作或者在延迟一段时间后执行某个操作。这在很多场景下非常有用,比如实现动画效果、定期更新数据显示、自动保存功能等。

例:创建用于检查闹钟的定时器

self.timer = QTimer(self)
self.timer.timeout.connect(self.check_alarm)
self.alarm_time = None  # 初始化闹钟时间

例:创建滚动动画的定时器

self.scroll_timer = QTimer(self)
self.scroll_timer.timeout.connect(self.scroll_footer_label)

②QTime

在 PyQt 中,QTime类主要用于表示时间。它提供了一种方便的方式来处理时间相关的操作,如获取当前时间、设置特定时间、比较时间大小、进行时间的加减运算等。这在很多需要涉及时间处理的应用场景中非常有用,例如日程安排应用、闹钟应用、时间记录工具等。

例:设置初始时间显示

self.ui.timeLabel.setText(QTime.currentTime().toString("HH:mm:ss"))

例: 判断用户输入的时间格式

self.alarm_time = QTime.fromString(input_time, "HH:mm:ss")
if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "H:m:s")
if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "HH:mm:ss")
if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "H:m:s")
if not self.alarm_time.isValid():self.ui.Alarm_display.setText("时间格式无效!")return

五、PyQt事件机制思维导图

PyQt事件机制思维导图

六、完整代码

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
from PySide6.QtCore import QTimer, QTime, Qt
from PySide6.QtGui import QPainter, QLinearGradient, QColor, QFont, QMouseEvent, QIcon
from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
from Alarm_clock import Ui_MainWindowclass GradientTextLabel(QLabel):def __init__(self, text="", parent=None):super().__init__(text, parent)self.setFont(QFont("Arial", 40, QFont.Weight.Bold))self.setStyleSheet("background-color: transparent;")  # 背景透明def paintEvent(self, event):painter = QPainter(self)painter.setRenderHint(QPainter.Antialiasing)# 创建一个线性渐变(红到紫,带透明度)gradient = QLinearGradient(0, 0, self.width(), 0)gradient.setColorAt(0.0, QColor(100, 0, 200, 200))  # 紫色,透明度78%gradient.setColorAt(1.0, QColor(255, 0, 0, 200))  # 红色,透明度78%# 设置文字渐变pen = painter.pen()pen.setBrush(gradient)  # 使用渐变作为笔刷pen.setWidth(2)  # 设置笔宽度painter.setPen(pen)# 绘制文字painter.drawText(self.rect(), Qt.AlignCenter, self.text())painter.end()class AlarmClock(QMainWindow):def __init__(self):super().__init__()# 初始化 UIself.ui = Ui_MainWindow()self.ui.setupUi(self)# 设置应用图标self.setWindowIcon(QIcon("G:\longz\人工智能作业\PythonQt\闹钟界面/蓝色风信子_爱给网_aigei_com.ico"))# 开始隐藏footerLabelself.ui.footerLabel.hide()# 设置时间标签为渐变文字标签self.gradient_label = GradientTextLabel(parent=self)self.gradient_label.setGeometry(self.ui.timeLabel.geometry())  # 保持位置一致self.ui.timeLabel.deleteLater()  # 删除原来的 timeLabelself.ui.timeLabel = self.gradient_label  # 替换为渐变标签# 设置初始时间self.ui.timeLabel.setText(QTime.currentTime().toString("HH:mm:ss"))# 固定窗口大小为 800x600self.setFixedSize(800, 600)# 启动时间更新定时器(始终更新)self.time_timer = QTimer(self)self.time_timer.timeout.connect(self.update_time_display)self.time_timer.start(1000)  # 每秒更新一次# 纯净窗口self.setWindowFlag(Qt.WindowType.FramelessWindowHint)# 定时器self.timer = QTimer(self)self.timer.timeout.connect(self.check_alarm)self.alarm_time = None# 滚动动画self.scroll_timer = QTimer(self)self.scroll_timer.timeout.connect(self.scroll_footer_label)self.footer_label_start_pos = self.ui.footerLabel.geometry().x()  # 起始位置self.footer_label_end_pos = -self.ui.footerLabel.width() + 800  # 结束位置# 音乐播放器self.media_player = QMediaPlayer(self)self.audio_output = QAudioOutput(self)self.media_player.setAudioOutput(self.audio_output)self.media_player.setSource("G:/longz/人工智能作业/PythonQt/闹钟界面/Scott Lloyd Shelly - Terraria Soundtrack - 01 Overworld Day.mp3")# 连接按钮点击事件self.ui.pushButton.clicked.connect(self.handle_button_click)# 处理按钮点击事件def handle_button_click(self):if self.ui.pushButton.text() == "启动":self.start_alarm_timer()elif self.ui.pushButton.text() == "停止":self.stop_alarm()# 停止闹钟def stop_alarm(self):# 停止定时器、滚动动画和音乐播放self.timer.stop()self.scroll_timer.stop()self.media_player.stop()self.ui.footerLabel.hide()# 重置按钮和状态显示self.ui.Alarm_display.setText("闹钟已停止")self.ui.pushButton.setText("启动")# 启动闹钟def start_alarm_timer(self):input_time = self.ui.Alarm_input.text()if not input_time:self.ui.Alarm_display.setText("请输入时间!")return# 支持多种时间格式self.alarm_time = QTime.fromString(input_time, "HH:mm:ss")if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "H:m:s")if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "HH:mm:ss")if not self.alarm_time.isValid():self.alarm_time = QTime.fromString(input_time, "H:m:s")if not self.alarm_time.isValid():self.ui.Alarm_display.setText("时间格式无效!")return# 格式化时间并显示formatted_time = self.alarm_time.toString("HH:mm:ss")self.ui.Alarm_input.setText(formatted_time)# 启动定时器self.timer.start(1000)self.ui.Alarm_display.setText("闹钟已启动")self.ui.pushButton.setText("停止")# 更新时间显示def update_time_display(self):current_time = QTime.currentTime()self.ui.timeLabel.setText(current_time.toString("HH:mm:ss"))# 检查闹钟是否到达时间def check_alarm(self):current_time = QTime.currentTime()if self.alarm_time and current_time >= self.alarm_time and current_time <= self.alarm_time.addSecs(600):self.ui.Alarm_display.setText("闹钟响了!")self.ui.footerLabel.show()if not self.scroll_timer.isActive():self.scroll_timer.start(30)  # 滚动动画if self.media_player.mediaStatus() != QMediaPlayer.MediaStatus.LoadingMedia:self.media_player.play()else:# 停止定时器、滚动动画和音乐播放self.scroll_timer.stop()self.media_player.stop()self.ui.footerLabel.hide()# 状态显示self.ui.Alarm_display.setText("闹钟已结束")# 滚动 footerLabeldef scroll_footer_label(self):current_geometry = self.ui.footerLabel.geometry()x = current_geometry.x() - 5  # 每次向左移动 5 像素# 如果超出左边界,将其重新设置到右边界if x < self.footer_label_end_pos:x = self.footer_label_start_posself.ui.footerLabel.setGeometry(x, current_geometry.y(), current_geometry.width(), current_geometry.height())def mousePressEvent(self, event: QMouseEvent):self.px = event.pos().x()self.py = event.pos().y()def mouseMoveEvent(self, event: QMouseEvent):if event.buttons() == Qt.MouseButton.LeftButton:self.move(int(event.globalPosition().x()) - self.px, int(event.globalPosition().y()) - self.py)if __name__ == "__main__":app = QApplication(sys.argv)window = AlarmClock()window.setWindowFlag(Qt.WindowType.FramelessWindowHint)window.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground)window.show()sys.exit(app.exec())

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

福昕PDF低代码平台

福昕PDF低代码平台简介 福昕PDF 低代码平台是一款创新的工具&#xff0c;旨在简化PDF处理和管理的流程。通过这个平台&#xff0c;用户可以通过简单的拖拽界面上的按钮&#xff0c;轻松完成对Cloud API的调用工作流&#xff0c;而无需编写复杂的代码。这使得即使没有编程经验的…

Thonny IDE + MicroPython + ESP32 + 0.96寸OLED(IIC) 显示任意字符

四针脚0.96英寸OLED显示屏模块的具体参数如下表所示。 参数名称 参数特性 分辨率 128x64像素 通信方式 IIC 驱动芯片 SSD1306 屏幕颜色 白色、蓝色或黄蓝双色 元件&#xff1a; 四针脚0.96英寸OLED显示屏模块 ESP32 DEVKIT_C开发板 杜邦线USB Type-C 接线&#xf…

STM32HAL库入门教程——常用外设学习(1)

目录 学习外设前提——学习时钟树 一、时钟树是什么&#xff1f; 二、如何配置时钟树 三、时钟树的组成 3.1.时钟源 3.2.锁相环 PLL 3.3.系统时钟 SYSCLK 3.4.时钟信号输出 MCO 简单创建一个CubeMX工程&#xff08;STMF103常用&#xff09; 一、STM32HAL库开发&#…

方案拆解 | 打击矩阵新规频出!2025矩阵营销该怎么玩?

社媒平台的矩阵营销又要“变天”了&#xff1f;&#xff01; 11月18日&#xff0c;小红书官方发表了被安全薯 称为“小红书史上最严打击黑灰产专项”新规&#xff0c;其中就包括黑灰产矩阵号的公告。 ▲ 图源&#xff1a;小红书 实际上&#xff0c;不包括这次&#xff0c;今年…

系统思考—决策偏误

决策的质量&#xff0c;决定企业的未来。作为创办人&#xff0c;是不是也遇到过这样的困境&#xff1a;信息太多&#xff0c;团队收到的都是差不多的内容&#xff0c;甚至还有不少误导性的消息&#xff0c;结果一不小心做出了错误决策&#xff1f;尤其是在现在这个瞬息万变的环…

通过U盘启动盘安装Windows10操作系统步骤

主要包括以下几步&#xff1a; 1.U盘格式化&#xff0c;U盘容量要求不小于8G&#xff0c;如下图所示&#xff1a; 2.U盘启动盘制作&#xff1a; (1).进微软官网https://www.microsoft.com/zh-cn/software-download/windows10 下载MediaCreationTool_22H2.exe&#xff0c;以管理…

k8s-容器运行时接口分析

1、为了什么需要 CRI &#xff1f; 在 k8s v1.5 之前&#xff0c;Docker 作为第一代的容器运行时&#xff0c; kubelet 通过内嵌其中的 DockerShim 操作 Docker API 来操作容器。在 Kubernetes 1.5 中引入了 CRI&#xff0c;可以解耦了kubelet与容器运行时&#xff0c;该插件接…

【日常记录-Mybatis】PageHelper导致语句截断

1. 简介 PageHelper是Mybatis-Plus中的一个插件&#xff0c;主要用于实现数据库的分页查询功能。其核心原理是将传入的页码和条数赋值给一个Page对象&#xff0c;并保存到本地线程ThreadLocal中&#xff0c;接下来&#xff0c;PageHelper会进入Mybatis的拦截器环节&#xff0c;…

自回归模型(AR )

最近看到一些模型使用了自回归方法&#xff0c;这里就学习一下整理一下相关内容方便以后查阅。 自回归模型&#xff08;AR &#xff09; 自回归模型&#xff08;AR &#xff09;AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…

吉他初学者学习网站搭建系列(9)——如何用coze做一个网站助手

文章目录 背景功能搭建智能体新增工作流效果总结 背景 随着AI大模型的普及&#xff0c;国内也涌现出许多帮助用户更便捷使用大模型的平台。扣子就是其中之一。国内已经有蛮多用户了&#xff0c;我试用了这个平台&#xff0c;来给我的网站搭建一个小助手&#xff0c;效果非常好…

【网络】网络基础知识(协议、mac、ip、套接字)

文章目录 1. 计算机网络的背景2. 认识网络协议2.1 协议分层2.2 OS与网络的关系 3. 网络传输基本流程3.1 局域网通信流程3.2 跨网络通信流程 4. Socket 编程预备4.1 理解源IP地址和目的IP地址4.2 端口号与Socket4.3传输层的典型代表4.4 网络字节序 5. socket 编程接口5.1 介绍5.…

qtcanpool 知 08:Docking

文章目录 前言口味改造后语 前言 很久以前&#xff0c;作者用 Qt 仿照前端 UI 设计了一个 ministack&#xff08;https://gitee.com/icanpool/qtcanpool/blob/release-1.x/src/libs/qcanpool/ministack.h&#xff09; 控件&#xff0c;这个控件可以折叠。部分用户体验后&#…

【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码

目录 一、PyQt5介绍&#xff1a; &#xff08;1&#xff09;PyQt简介&#xff1a; &#xff08;2&#xff09;PyQt API&#xff1a; &#xff08;3&#xff09;支持的环境&#xff1a; &#xff08;4&#xff09;安装&#xff1a; &#xff08;5&#xff09;配置环境变量…

青海摇摇了3天,技术退步明显.......

最近快手上的青海摇招聘活动非常火热&#xff0c;我已经在思考是否备战张诗尧的秋招活动。开个玩笑正片开始&#xff1a; 先说一下自己的情况&#xff0c;大专生&#xff0c;20年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c…

DDD第一话:业务领域分析

业务领域的概念 业务领域定义了公司的主要活动领域&#xff0c;这是公司为客户提供的服务内容。例如&#xff1a;联邦快递提供快递服务&#xff1b;星巴克最出名的是它的咖啡。 子域 为了实现其业务领域的目标和目标&#xff0c;公司必须在多个子领域中操作。子域是业务活动…

MongoDB change stream实战

什么是 Chang Stream Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类似于关系数据库的触发器&#xff0c;但原理不完全相同&#xff1a; Change Stream 的实…

Linux其二设置端口号,静态ip以及命令

目录 1、VI编辑器 【linux版本的文本文件】 2&#xff09; 补充的vi编辑器的其他内容(了解) 2、ln 连接的意思 link的缩写 3、文件的查看 【重点】 4、压缩与解压&#xff08;重点&#xff09; 5、find 查找命令 6、which & whereis 作用是一样的&#xff0c;表示某…

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…

WEB开发: Node.js路由之由浅入深(一) - 全栈工程师入门

作为一个使用Node.js多年的开发者&#xff0c;我已经习惯于用Node.js写一些web应用来为工作服务&#xff0c;因为实现快速、部署简单、自定义强。今天我们一起来学习一个全栈工程师必备技能&#xff1a;web路由。&#xff08;观看此文的前提是默认你已经装好nonde.js了&#xf…

【后端面试总结】Redis字符串实现原理

字符串是我们平时接触频率最高的一个基础类型&#xff0c;但就是这么一个平平无奇的基本类型&#xff0c;在Redis里面也是经历了各种各样的优化&#xff0c;来优化它对内存的占用&#xff0c;了解这部分内容&#xff0c;与其说是“学习Redis”&#xff0c;不如说是“向Redis学习…