简体   繁体   English

QStateMachine 程序转换(即信号)

[英]QStateMachine procedural transition (i.e. Signal)

I need to be able to change state of a QStateMachine from a Signal (or something equivalent) that was not generated by user interaction (ie by a process completing).我需要能够从不是由用户交互(即通过进程完成)生成的信号(或等效的东西)更改 QStateMachine 的状态。 This example redirectsa user generated signal to demonstrate the idea, but doesn't yet work.这个例子重定向用户生成的信号来演示这个想法,但还没有工作。 Here, the push button signals fire other signals that I want to use for the transition.在这里,按钮信号会触发我想用于转换的其他信号。 The states here are B1 <-> B2 where Bi -> Bj on the redirected signal when button bi is pressed.这里的状态是B1 <-> B2其中Bi -> Bj在按下按钮bi时重定向的信号。

The QStateMachine documentation only seems to cover transitions based on direct signals from buttons and I haven't been able to extrapolate to the more general case of using any Signal (ie one that I create). QStateMachine 文档似乎只涵盖基于来自按钮的直接信号的转换,我无法推断使用任何信号(即我创建的信号)的更一般情况。

import sys
from PySide2.QtCore import Qt, QStateMachine, QState, Signal as QSignal
from PySide2.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget

class MainWindow(QMainWindow):
    
    def __init__(self):
        QMainWindow.__init__(self)

        self.w = QWidget()
        self.setCentralWidget(self.w)
        
        l1 = QVBoxLayout()
        self.b1 = QPushButton("B1", self.w)
        self.b1.pressed.connect(self.b1Pressed)
        l1.addWidget(self.b1)
        self.b2  = QPushButton("B2", self.w)
        self.b2.pressed.connect(self.b2Pressed)
        l1.addWidget(self.b2)
        
        self.w .setLayout(l1)
        
        self.setupStateMachine()
        self.show()

    def b1Pressed(self):
        print("b1 pressed")
        self._b1Pressed.emit()
        
    def b2Pressed(self):
        print("b2 pressed")
        self._b2Pressed.emit()
            
    def setupStateMachine(self):
        
        self._b1Pressed = QSignal()
        self._b2Pressed = QSignal()
        
        self.sm = QStateMachine()
        
        self.B1 = QState()
        self.B1.assignProperty(self.b1, "enabled", True)
        self.B1.assignProperty(self.b2, "enabled", False)
        self.sm.addState(self.B1)

        self.B2 = QState()
        self.B2.assignProperty(self.b1, "enabled", False)
        self.B2.assignProperty(self.b2, "enabled", True)
        self.sm.addState(self.B2)
        
        # The point of it all:
        # change states from a signal (or program generated event)
        self.B1.addTransition(self._b1Pressed, self.B2)
        self.B2.addTransition(self._b2Pressed, self.B1)

if __name__ == '__main__':

    app = QApplication(sys.argv)
    window = MainWindow()
    sys.exit(app.exec_())

Your code has the following problems:您的代码存在以下问题:

  • The signals are not declared as attributes of the class but at the same level of the methods.信号不是声明为类的属性,而是在方法的同一级别。
  • You have not established an initial state.您尚未建立初始状态。
  • You have not started the QStateMachine.您尚未启动 QStateMachine。
class MainWindow(QMainWindow):
    _b1Pressed = QSignal() _b2Pressed = QSignal()

    def __init__(self):
        QMainWindow.__init__(self)

        self.w = QWidget()
        self.setCentralWidget(self.w)

        l1 = QVBoxLayout()
        self.b1 = QPushButton("B1", self.w)
        self.b1.pressed.connect(self.b1Pressed)
        l1.addWidget(self.b1)
        self.b2 = QPushButton("B2", self.w)
        self.b2.pressed.connect(self.b2Pressed)
        l1.addWidget(self.b2)

        self.w.setLayout(l1)

        self.setupStateMachine()
        self.show()

    def b1Pressed(self):
        print("b1 pressed")
        self._b1Pressed.emit()

    def b2Pressed(self):
        print("b2 pressed")
        self._b2Pressed.emit()

    def setupStateMachine(self):

        self.sm = QStateMachine()

        self.B1 = QState()
        self.B1.assignProperty(self.b1, "enabled", True)
        self.B1.assignProperty(self.b2, "enabled", False)
        self.sm.addState(self.B1)

        self.B2 = QState()
        self.B2.assignProperty(self.b1, "enabled", False)
        self.B2.assignProperty(self.b2, "enabled", True)
        self.sm.addState(self.B2)

        # The point of it all:
        # change states from a signal (or program generated event)
        self.B1.addTransition(self._b1Pressed, self.B2)
        self.B2.addTransition(self._b2Pressed, self.B1)

        self.sm.setInitialState(self.B1) self.sm.start()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM