如何在 QPushbutton 的两个功能之间来回切换?

Posted

技术标签:

【中文标题】如何在 QPushbutton 的两个功能之间来回切换?【英文标题】:How do I change back and forth between two functionalities of a QPushbutton? 【发布时间】:2015-05-24 12:10:42 【问题描述】:

我一直在快速编写一个带有 QVBoxLayout 的简单 QDialog,该 QDialog 具有启用我的 Arduino 项目的功能,我真的想更新我放置的 QPushButton 以使其从“开始”到“停止”并返回每个时间。以“开始”为文本的 QPushButton 位于已定义 QDialog 的主类中,单击它会运行相关函数,其中按钮的文本将更改为“停止”。现在,当用户单击带有“停止”的按钮时,我想将其更改回“开始”,该按钮应该再次可单击并转到相关功能,更改为停止并打开。我一直无法做到这一点。有人可以帮帮我吗?

您可能已经知道,我是初学者。我无法理解 QThreads、processEvents()、update() 以及当我搜索“更新 GUI”或“刷新 GUI”时弹出的所有其他内容。无论我需要做什么,请尽可能简单明了地解释!

这是我的 GUI 代码:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import sys

class StepperMotor(QDialog):   
    def __init__(self):
        QDialog.__init__(self)
        layout1 = QVBoxLayout()
        label1 = QLabel("Stepper Motor Control")
        label1.setAlignment(Qt.AlignCenter)
        angle = QLineEdit()
        speed = QLineEdit()
        self.period = QLineEdit()
        angle.setPlaceholderText("Enter Angle")
        speed.setPlaceholderText("Enter Speed in RPM")
        layout1.addWidget(label1)
        layout1.addWidget(angle)
        layout1.addWidget(speed)
        layout2 = QHBoxLayout()        
        layout3 = QHBoxLayout()
        layout4 = QHBoxLayout()
        layout5 = QHBoxLayout()
        labelx = QLabel("Type")
        labelx.setAlignment(Qt.AlignCenter)
        self.cb1 = QCheckBox()
        self.cb1.setText("Linear")
        layout2.addWidget(self.cb1)
        self.cb2 = QCheckBox()
        self.cb2.setText("Sinusoidal")
        layout2.addWidget(self.cb2)
        self.cb3 = QCheckBox()
        self.cb3.setText("Randomized")
        layout2.addWidget(self.cb3)
        layout2.setAlignment(Qt.AlignCenter)
        self.labely = QLabel("Direction")
        self.labely.setAlignment(Qt.AlignCenter)
        self.labely.setEnabled(False)
        self.cb4 = QRadioButton()
        self.cb4.setText("Clockwise")
        self.cb5 = QRadioButton()
        self.cb5.setText("Counter-Clockwise")
        layout3.setAlignment(Qt.AlignCenter)        
        layout3.addWidget(self.cb4)        
        layout3.addWidget(self.cb5)
        self.group = QButtonGroup()
        self.group.addButton(self.cb4)
        self.group.addButton(self.cb5) 
        self.cb4.setEnabled(False)
        self.cb5.setEnabled(False)
        self.btn1 = QPushButton("Start")
        #self.btn1.clicked.connect(self.start)
        btn2 = QPushButton("Cancel")
        btn2.clicked.connect(self.close)
        layout1.addWidget(labelx)
        layout1.addLayout(layout2)
        layout1.addWidget(self.labely)
        layout1.addLayout(layout3)
        layout1.addLayout(layout4)
        layout1.addLayout(layout5)
        layout1.addWidget(label2)
        layout4.addWidget(self.btn1)
        layout4.addWidget(btn2)              
        layout5.addWidget(label3)
        layout5.addWidget(label4)
        self.setLayout(layout1)
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.setWindowTitle("SMCM")
        self.setFocus()
        self.cb1.stateChanged.connect(self.statuscheck1)
        self.cb2.stateChanged.connect(self.statuscheck2)
        self.cb3.stateChanged.connect(self.statuscheck3)

    def statuscheck1(self):
        if self.cb1.isChecked():
            self.cb2.setEnabled(False)
            self.cb3.setEnabled(False)            
            self.cb4.setEnabled(True)
            self.cb5.setEnabled(True)
            self.labely.setEnabled(True)
        elif self.cb2.isChecked() or self.cb3.isChecked():
            self.cb4.setChecked(False)
            self.cb5.setChecked(False)
            self.cb4.setEnabled(False)
            self.cb5.setEnabled(False)
            self.labely.setEnabled(False)
        else:
            self.group.setExclusive(False)        
            self.cb4.setChecked(False)
            self.cb5.setChecked(False)
            self.group.setExclusive(True)
            self.cb2.setEnabled(True)
            self.cb3.setEnabled(True)
            self.cb4.setEnabled(False)
            self.cb5.setEnabled(False)
            self.labely.setEnabled(False)

    def statuscheck2(self):
        if self.cb2.isChecked():
            self.cb1.setEnabled(False)
            self.cb3.setEnabled(False)
        else:
            self.cb1.setEnabled(True)
            self.cb3.setEnabled(True)

    def statuscheck3(self):
        if self.cb3.isChecked():
            self.cb1.setEnabled(False)
            self.cb2.setEnabled(False)    
        else:
            self.cb1.setEnabled(True)
            self.cb2.setEnabled(True)

    def event(self, event): 
        if event.type() == QEvent.EnterWhatsThisMode:
            QWhatsThis.leaveWhatsThisMode()
            return True
        return QDialog.event(self, event)

if __name__ == "__main__":

    app = QApplication(sys.argv)
    dialog = StepperMotor()
    dialog.show()
    sys.exit(app.exec_())

您可能会说我希望能够从这里启动和停止步进电机!

【问题讨论】:

请更新您的问题以显示您目前拥有的相关代码。 【参考方案1】:

一个非常简单的方法是创建一个可检查的按钮并将其连接到单击的信号[bool]。因此,每次单击按钮时,都会将一个 bool 值传递给您的插槽。

self.btn = QtGui.QPushButton('Stop')
self.btn.clicked[bool].connect(self.onStop)
self.btn.setCheckable(True)

def onStop(self, status):
    if status:
        #your code when stop is pressed
        self.btn.setText('Start')
    else:
        #your code when start is pressed
        self.btn.setText('Stop')

【讨论】:

似乎是一个合理的解决方案,但在您的示例中,if 子句的方式错误。 非常感谢您的帮助!它就像一个魅力!虽然我第一次执行程序时必须单击两次启动。我通过每次将 bool 设置为 false 来修复它,因为切换 if-else 语句似乎不起作用。

以上是关于如何在 QPushbutton 的两个功能之间来回切换?的主要内容,如果未能解决你的问题,请参考以下文章

在两个视图控制器之间展开 Segue 来回 Swift

在两个打开的活动之间来回移动数据

Qt中槽函数如何获取按钮QPushButton的按钮文本

如何在不同的功能中改变 QPushButton 的颜色? [复制]

tkinter - 使用按钮在帧之间来回切换

在视图之间来回切换时保留一个值