PySide6 QStateMachine状态机的实现

PySide6的状态机模块提供了一种方便的方式来实现状态机模式,用于管理程序的状态和状态转换。通过使用PySide6的状态机模块,开发者可以更加清晰地组织程序逻辑,使程序更易于维护和扩展。

在PySide6中,状态机相关的类主要包括:
1. QState:表示一个状态,可以设置状态进入时执行的操作和离开时执行的操作。
2. QFinalState:表示最终状态,用于标识状态机的结束状态。
3. QStateMachine:表示状态机本身,可以管理多个状态和状态之间的转换。
4. QSignalTransition:表示基于信号的状态转换,可以在特定信号触发时实现状态之间的转换。

通过使用这些类,开发者可以创建和管理程序的状态机,定义状态之间的转换条件,并在状态转换时执行相应的操作。这样可以帮助开发者更好地控制程序的行为,提高程序的可维护性和可扩展性。

在PySide6中,状态机模块的使用与Qt中的类似,通过创建状态、添加状态到状态机、设置初始状态、建立状态转换等步骤来实现状态机的功能。开发者可以根据具体的需求和场景,灵活运用状态机模块来优化程序逻辑。

总的来说,PySide6的状态机模块为开发者提供了一个强大而灵活的工具,帮助管理复杂程序的状态和行为,使程序更加清晰和易于维护。下面先是个简单示例

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtStateMachine import QState,QStateMachine,QFinalState,QSignalTransition



class Window(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        self.init_buttons()

        stop :QState = QState()
        running :QState = QState()
        pause :QState = QState()

        #创建一个状态机
        machine = QStateMachine(self)
        #将状态添加到状态机
        machine.addState(stop)
        machine.addState(running)
        machine.addState(pause)
        #设置初始状态机状态
        machine.setInitialState(stop)

        #设置转换条件
        stop_to_run = stop.addTransition(self.btn.clicked,running)
        run_to_pause = running.addTransition(self.btn.clicked,pause)
        pause_to_run = pause.addTransition(self.btn.clicked,running)

        #可以触发的信号
        run_to_pause.triggered.connect(lambda :print("pase状态触发了,可以写相关逻辑代码"))

        #根据状态切换相对于的属性值
        stop.assignProperty(self.lab2,'text',"stop state")
        pause.assignProperty(self.lab2,'text',"pause state")
        running.assignProperty(self.lab2,'text','running state')

        #启动状态机
        machine.start()


    def init_buttons(self):
        self.resize(300,300)
        label = QLabel("当前状态:",self)
        label.move(50,50)

        self.lab2 = QLabel("",self)
        self.lab2.setGeometry(150,50,80,20)
        self.lab2.setStyleSheet("border:2px solid blue")

        self.btn = QPushButton("click",self)
        self.btn.move(200,200)



if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec())








上面代码使用PySide6实现了一个简单的状态机示例。在这个示例中,定义了三个状态:stop、running和pause,并设置了状态之间的转换条件。当点击按钮时,状态会按照设定的转换条件进行切换,并相应地修改一个label的文本内容以展示当前状态。

在代码中,首先创建了三个状态stop、running和pause,并将它们添加到状态机中。然后设置了初始状态为stop,并定义了状态之间的转换条件:从stop转换到running,从running转换到pause,从pause转换回running。

另外,通过assignProperty方法,根据状态的改变,修改了一个label的文本内容来展示当前状态。

最后,启动了状态机,并显示了一个窗口,包含一个label用于显示当前状态和一个按钮用于触发状态转换。

上面的状态机有一问题,就是永远在running 和 pause之间来回切换,显然这不是我们想要的。我们可以在增加一个复位按钮,当点击后,让状态机归为stop状态。这个很好实现

添加一个按钮

self.btn_reset = QPushButton("reset",self)
self.btn_reset.move(100,200)

设置状态:

#复位状态机
running.addTransition(self.btn_reset.clicked,stop)
pause.addTransition(self.btn_reset.clicked,stop)

完整代码如下:

import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import *
from PySide6.QtStateMachine import QState,QStateMachine,QFinalState,QSignalTransition



class Window(QWidget):
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        self.init_buttons()

        stop :QState = QState()
        running :QState = QState()
        pause :QState = QState()

        #创建一个状态机
        machine = QStateMachine(self)
        #将状态添加到状态机
        machine.addState(stop)
        machine.addState(running)
        machine.addState(pause)
        #设置初始状态机状态
        machine.setInitialState(stop)

        #设置转换条件
        stop_to_run = stop.addTransition(self.btn.clicked,running)
        run_to_pause = running.addTransition(self.btn.clicked,pause)
        pause_to_run = pause.addTransition(self.btn.clicked,running)

        #复位状态机
        running.addTransition(self.btn_reset.clicked,stop)
        pause.addTransition(self.btn_reset.clicked,stop)

        #可以触发的信号
        run_to_pause.triggered.connect(lambda :print("pase状态触发了,可以写相关逻辑代码"))

        #根据状态切换相对于的属性值
        stop.assignProperty(self.lab2,'text',"stop state")
        pause.assignProperty(self.lab2,'text',"pause state")
        running.assignProperty(self.lab2,'text','running state')


        #启动状态机
        machine.start()


    def init_buttons(self):
        self.resize(300,300)
        label = QLabel("当前状态:",self)
        label.move(50,50)

        self.lab2 = QLabel("",self)
        self.lab2.setGeometry(150,50,80,20)
        self.lab2.setStyleSheet("border:2px solid blue")

        self.btn = QPushButton("click",self)
        self.btn.move(200,200)

        self.btn_reset = QPushButton("reset",self)
        self.btn_reset.move(100,200)




if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec())








假如这个状态切换伴随着其他操作比如歌曲的播放和暂停,那在按钮按下时,需要对应的操作。对于按钮来说,都是click状态,怎么知道是谁切换到谁呢?可以通过判断标签的属性来确定,但更好的办法是不同的状态切换时直接触发对应的处理。

将stop的addTransition改造一下。 addTransition添加的参数可以是QSignalTransition类。QSignalTransition在初始化时,设置上关联的控件和控件动作。然后通过 setTargetState设置成将要变成的状态,通过triggered信号,来绑定触发时对应的行为(这里添加了一个槽函数)。再用stop状态添加新创建的QSignalTransition,完成状态切换的设置。未完待续。。。。



  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索k8s集群中kubectl的陈述式资源管理

一、k8s集群资源管理方式分类 1.1陈述式资源管理方式:增删查比较方便,但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式:yaml文件管理 使用yaml配置文件或者json配置文…

Monkey自动化测试(Android)吐血整理(超详细)

一、前言 随机的命令对APP进行自动化测试,可以快速发现APP的问题,若执行时设置的-S 100出现了一个错误,后面再执行时,只需设置相同的-S,就会按照第一次执行命令的顺序再次执行 自动化就是比较有针对性的对某一个功能…

Jenkins部署成功后自动发通知到钉钉群

钉钉上如何配置 选择钉钉群,找到群设置-机器人-添加机器人 选择自定义 选择【添加】 选择【加签】,复制值,后续在jenkins里配置时会用到 复制Webhook地址,后面在jenkins里配置的时候要用到 Jenkins上如何配置 系统管理-插件管…

数学建模~~多目标规划

1.认识多目标规划 (1)前面我们介绍的是单目标规划,现在我们要认识一下多目标规划: (2)使用上面的这个题目作为例子,简单的翻译一下题干,这个题目说的就是 有1,2这两种产…

LeetCode题练习与总结:二叉树的最大深度--104

一、题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root […

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下: nginx配置如下: 访问地址: zhadmin.iotzzh.com image.png

SD-WAN EVPN基本原理

SD-WAN EVPN是一种用于Overlay业务网络和底层传输网络分离以及业务网络路由和传输网络路由分离的VPN技术。SD-WAN EVPN技术采用类似于BGP/MPLS IP VPN的机制,通过扩展BGP协议,使用扩展后的可达性信息,使不同站点的底层传输网络互通&#xff0…

【NumPy】关于numpy.loadtxt()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

微服务如何做好监控

大家好,我是苍何。 在脉脉上看到这条帖子,说阿里 P8 因为上面 P9 斗争失败走人,以超龄 35 被裁,Boss 上找工作半年,到现在还处于失业中。 看了下沟通记录, 沟通了 1000 多次,但没有一个邀请投递…

MySQL-笔记-02.关系模型基本理论

目录 2.1 关系模型 2.1.1 基本概念 2.1.2 关系的完整性 1 实体完整性 2 参照完整性 3 用户定义完整性 2.2 关系代数 2.2.1 传统的集合运算 1 并运算 2 交运算 3 差运算 4 ​​笛卡尔积​编辑 2.2.2 专门的关系运算 1 选择 2 投影 3 连接 (1)等…

活动预告|来 GIAC 大会听大数据降本利器:AutoMQ 基于云原生重新设计的 Kafka

GIAC大会 2024年5月24日至25日,2024 全球互联网架构大会(简称:GIAC大会)将于深圳华侨城洲际酒店举行。大会将聚焦互联网架构热门的 AIGC、效能提升、 云原生架构、数据智能、新硬件等领域,甄选前沿的有典型代表性的技…

“手撕”String类+练习题

目录 一、什么是String类 二、String类的使用 三、String类的字符串操作 String对象的比较 字符串的查找 字符串的转换 字符串的替换 字符串的拆分 字符串的截取 大小写和去空格方法 四、字符串的不可变性 五、字符串的修改 六、StringBuilder类和StringBuffer类…

正确可用--Notepad++批量转换文件编码为UTF8

参考了:Notepad批量转换文件编码为UTF8_怎么批量把ansi转成utf8-CSDN博客​​​​​​https://blog.csdn.net/wangmy1988/article/details/118698647我参考了它的教程,但是py脚本写的不对. 只能改一个.不能实现批量更改. 他的操作步骤没问题,就是把脚本代码换成我这个. #-*-…

解锁创意新境界:StartAI插件让Photoshop飞起来!

Photoshop AI插件的革命性突破:StartAI插件的全面体验 作为一名AIGC测评博主,我一直在寻找能够提升设计效率和创意表现的工具。今天,我将带大家深入了解一款令人兴奋的Photoshop AI插件——StartAI,它不仅为设计师带来了前所未有…

新零售数据中台:构建零售业高效率、智能化的数据处理平台_光点科技

随着互联网技术的快速发展和移动支付、大数据等技术的广泛应用,零售行业已经逐渐从传统零售向新零售模式转变。在这个变革的时代背景下,新零售数据中台应运而生,它作为零售行业数据资源的整合与智能分析的核心载体,成为推动零售行…

C语言-----数据存储

# define _CRT_SECURE_NO_WARNINGS # include<stdio.h>int main(void) {char a -1;signed char b -1;unsigned char c -1;printf("a%d,b%d,c%d", a, b, c); //a-1,b-1,c255 }

Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。

给定任意数量的输入图像&#xff0c;使用以这些图像为条件的多视图扩散模型来生成场景的新视图。生成的视图被输入到强大的 3D 重建管道&#xff0c;生成可以交互渲染的 3D 表示。总处理时间&#xff08;包括视图生成和 3D 重建&#xff09;仅需一分钟。 相关链接 论文&#x…

Redis主从、哨兵、集群讲解

一、Redis主从 大家在面试中可能经常会被问到Redis的高可用问题。Redis高可用回答包括两个层面&#xff0c;一个就是数据不能丢失&#xff0c;或者说尽量减少丢失 ;另外一个就是保证Redis服务不中断 。 对于尽量减少数据丢失&#xff0c;可以通过AOF和RDB保证。 对于保证服务…

ROS | 用C++和python实现运动控制功能

基础知识&#xff1a; 用C实现&#xff1a; C代码&#xff1a; 用python实现&#xff1a; Python代码&#xff1a;

Git学习和使用指南详细篇

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…