当前位置: 首页 > news >正文

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

相关文章:

PyQt事件机制及其应用

一、实例前置 一个小闹钟应用 创建主窗口类 首先我们创建了一个名为AlarmClock的类&#xff0c;它继承自QMainWindow。这个类将包含我们的GUI组件和逻辑。 from Alarm_clock import Ui_MainWindowclass AlarmClock(QMainWindow):def __init__(self):super().__init__()# 初始化…...

厦门凯酷全科技有限公司抖音电商服务的卓越典范

在短视频和直播带货迅速崛起的时代&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全科技”&#xff09;以其专业的服务、创新的精神以及对市场的深刻理解&#xff0c;在抖音电商领域中脱颖而出&#xff0c;成为众多品牌商家信赖的选择。本文将深入探讨凯酷全科…...

vue3水波柱状图 ,实现

效果图 //引用页面 <div style"height: 60px;background-color: #fff;border-radius: 5px;width: 40px;"><WavePercentage:percentage"progress"primary-color"#ffcb7c"secondary-color"#ffcb7c"/></div>import Wa…...

如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制

如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制 如何在两台 PostgreSQL 服务器之间使用逻辑复制槽进行数据复制环境准备1. 配置主服务器&#xff08;Publisher&#xff09;1.1 修改 postgresql.conf1.2 修改 pg_hba.conf1.3 重启 PostgreSQL 服务1.4 创建逻辑复制…...

System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本

问题1&#xff1a;“/”应用程序中的服务器错误。 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。 说明: 执行当前 Web 请求期间&#xff0c;出现未经处理的异常。请检查堆栈跟踪信息&#xff0c;以了解有关该错误以及代码中导致错误的出处的详细…...

【机器人】振动分析和控制工具之Bode图

Bode 图完整介绍 Bode 图由两个部分组成&#xff1a; 幅值图 (Magnitude Plot)&#xff1a;描述系统对不同频率输入信号的增益大小&#xff08;幅值响应&#xff09;。相位图 (Phase Plot)&#xff1a;描述系统输出信号相对于输入信号的相位差。 Bode 图的横轴是频率&#x…...

生成:安卓证书uniapp

地址&#xff1a; https://ask.dcloud.net.cn/article/35777 // 使用keytool -genkey命令生成证书&#xff1a; 官网&#xff1a; keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore ----------------------------------…...

酒店/电影推荐系统里面如何应用深度学习如CNN?

【1】酒店推荐系统里面如何应用CNN&#xff1f;具体过程是什么 在酒店推荐系统中应用卷积神经网络&#xff08;CNN&#xff09;并不是一个常见的选择&#xff0c;因为 CNN 主要用于处理具有空间结构的数据&#xff0c;如图像、音频和某些类型的序列数据。然而&#xff0c;在某…...

【CSS in Depth 2 精译_069】11.3 利用 OKLCH 颜色值来处理 CSS 中的颜色问题(上)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 11.2.2.1 RGB…...

Redis篇-6--原理篇5--单线程模型

1、概述 Redis 采用单线程模型来处理客户端请求&#xff0c;这意味着在任意时刻只有一个命令被执行。这种设计简化了 Redis 的实现&#xff0c;并确保了高并发环境下的数据一致性。尽管 Redis 是单线程的&#xff0c;但它通过高效的内存管理和网络 I/O 操作&#xff0c;仍然能…...

Java版-图论-最小生成树-Prim算法

实现描述 如图&#xff1a; Prim算法的基本思想是从一个顶点开始&#xff0c;逐步构建最小生成树。具体步骤如下&#xff1a; 随机选取一个顶点作为起始点&#xff0c;并将其加入最小生成树的集合中。从该顶点出发&#xff0c;选择一条边连接到其他未被访问的顶点中的最小权…...

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头&#xff0c;如下&#xff1a; #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号&#xff0c;还有 ‘’’ 和 “”"&#xff1a; #!/usr/bin/python3# 第一个注释…...

vue2使用rtsp视频流接入海康威视摄像头(纯前端)

一.获取海康威视rtsp视频流 海康威视官方的RTSP最新取流格式如下: rtsp://用户名:密码IP:554/Streaming/Channels/101 用户名和密码 IP就是登陆摄像头时候的IP(笔者这里IP是192.168.1.210) 所以笔者的rtsp流地址就是rtsp://用户名:密码192.168.1.210:554/Streaming/Channel…...

利用PHP和GD库实现图片拼接的方法

利用PHP和GD库实现图片拼接的方法主要涉及到加载图片资源、创建目标画布、将图片资源绘制到目标画布上&#xff0c;并最终输出或保存拼接后的图片。以下是实现图片拼接的基本步骤&#xff1a; 加载图片资源&#xff1a; 使用imagecreatefromjpeg()、imagecreatefrompng()或ima…...

自动驾驶领域常用的软件与工具

CarSim&#xff1a;专门针对车辆动力学的仿真软件&#xff0c;能够预测和仿真汽车整车的操纵稳定性、制动性、平顺性、动力性和经济性。CarMaker&#xff1a;德国IPG公司推出的动力学、ADAS和自动驾驶仿真软件&#xff0c;提供精准的车辆本体模型和闭环仿真系统。VTD (Virtual …...

uniapp-内部项目使用文档

uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容&#xff1a;阶段1问题记录&#xff1a; 阶段2自行实现内容&#xff1a; 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...

ASP .NET Core 中的环境变量

在本文中&#xff0c;我们将通过组织一场小型音乐会&#xff08;当然是在代码中&#xff09;来了解 ASP .NET Core 中的环境变量。让我们从创建项目开始&#xff1a; dotnet new web --name Concert 并更新Program.cs&#xff1a; // replace this: app.MapGet("/"…...

学科竞赛管理系统

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 摘 要 随着国家教育体制的改革&#xff0c;全国各地举办的竞赛活动数目也是逐年增加&#xff0c;面对如此大的数目的竞赛信息&#xff0c;传统竞赛管理方式已经无法满足需求&#xff0c;为了提高效率&am…...

unity 让文字变形

效果&#xff1a; using TMPro; using UnityEngine; using NaughtyAttributes;[ExecuteInEditMode] public class TMTextPerpective : MonoBehaviour {[OnValueChanged("DoPerspective")][Range(-1f, 1f)]public float CenterBias 0f;[OnValueChanged("DoPers…...

Linux高并发服务器开发 第一天(Linux的目录结构 cd用法 终端提示符格式)

目录 1.命令解析器&#xff1a;shell 2.LINUX下的目录结构 3.cd的使用 3.1cd 绝对路径 3.2cd 相对路径 3.3cd 回车 3.4cd - 4. 终端提示符格式 1.命令解析器&#xff1a;shell 默认运行与计算机系统终端的 用来解析用户输入命令的工具 内核&#xff1a;操作系统的核…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...