当前位置: 首页 > 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;操作系统的核…...

PY32F030K28U6TR最小系统板设计详解:国产Cortex-M0+嵌入式开发实战平台

1. 项目概述PY32F030K28U6TR最小系统板是一款面向嵌入式开发与教学实践的高集成度硬件平台。该设计以聚辰半导体&#xff08;GigaDevice&#xff09;推出的PY32F030系列超低功耗32位ARM Cortex-M0微控制器为核心&#xff0c;完整实现最小启动系统所需全部外围电路&#xff0c;并…...

ESP32嵌入式GUI终端:天气时钟+MP3播放器全栈实现

1. 项目概述 ESP32天气时钟与SD卡MP3播放器是一个面向嵌入式人机交互场景的综合性硬件项目&#xff0c;融合了网络通信、实时信息获取、图形用户界面渲染、音频解码与播放控制等关键技术模块。该项目并非简单的功能堆砌&#xff0c;而是围绕“桌面智能终端”这一明确应用场景展…...

一文读懂安森美超低功耗,超强性能,支持边缘AI开发的双模蓝牙芯片

NCH-RSL20- 103WC61-ABG &#xff08;下文简称RSL20&#xff09;是安森美半导体于2026年2月刚发布的一颗2.4GHz超低功耗双模蓝牙芯片&#xff08;也就是说&#xff0c;它支持经典蓝牙的BR与EDR&#xff0c;A2DP,HFP以及低功耗蓝牙的LE audio Auracast™&#xff09;&#xff0c…...

搞工控的老铁对安川MP7系列肯定不陌生,这货在产线上跑得比双十一快递还勤快。今天咱们扒开它的源码裤衩,看看那些藏在十六进制背后的骚操作

安川7源码 文档 具体见图片先瞅一段运动轨迹规划的C代码片段&#xff1a; void SCurve_Generator(int32_t target_pos) {volatile uint16_t *reg (uint16_t*)0xFFFF8000; //特殊寄存器地址if(*reg & 0x0001) {jerk_ctrl (*reg >> 8) & 0xFF; //从寄存器抠出加…...

大模型落地实战:技术选型到部署全解析

大模型落地实践指南&#xff1a;技术路径与关键挑战 企业级大模型应用需从技术选型开始。主流技术路径包括基于开源框架&#xff08;如LLaMA、Falcon&#xff09;的微调、使用API服务&#xff08;如GPT-4、Claude&#xff09;的快速接入&#xff0c;以及混合部署模式。技术选型…...

Colyseus 传输层终极指南:WebSocket、TCP 和 uWebSockets 的实战应用

Colyseus 传输层终极指南&#xff1a;WebSocket、TCP 和 uWebSockets 的实战应用 【免费下载链接】colyseus ⚔ Multiplayer Framework for Node.js 项目地址: https://gitcode.com/gh_mirrors/co/colyseus Colyseus 是一个强大的 Node.js 多人游戏框架&#xff0c;提供…...

SmolVLA实战案例:结合RealSense D435i深度相机的3D动作增强方案

SmolVLA实战案例&#xff1a;结合RealSense D435i深度相机的3D动作增强方案 1. 项目背景与核心价值 想象一下&#xff0c;你有一个机器人手臂&#xff0c;你想让它“拿起那个红色的方块&#xff0c;放进蓝色的盒子里”。传统方法可能需要你写一堆复杂的代码&#xff0c;告诉它…...

多模态预演:all-MiniLM-L6-v2文本Embedding如何为多模态系统打基础

多模态预演&#xff1a;all-MiniLM-L6-v2文本Embedding如何为多模态系统打基础 1. 认识all-MiniLM-L6-v2&#xff1a;轻量级语义表示专家 all-MiniLM-L6-v2是一个专门为高效语义表示设计的轻量级句子嵌入模型。它基于BERT架构&#xff0c;但通过精巧的设计实现了性能与效率的…...

Step3-VL-10B在教育场景落地:STEM题图解析与代码逻辑推理实战

Step3-VL-10B在教育场景落地&#xff1a;STEM题图解析与代码逻辑推理实战 1. 引言&#xff1a;当AI遇到教育难题 想象一下这个场景&#xff1a;一位中学物理老师正在准备明天的课程&#xff0c;他需要从网上找一张电路图来讲解并联电路。找到图片后&#xff0c;他不仅要自己理解…...

2026精选课题-基于springboot大学生社团管理系统的设计与实现

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/学生代理交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...