让 QPushButton 执行 2 个操作?

M. *_*uiz 2 python user-interface qt python-3.x pyqt5

前言:我正在 PyQt5 中开发一个抽认卡应用程序,我试图让“Enter”按钮执行一个操作,通过调用一个函数来比较 2 个字符串(其中一个来自 textEdit 框,另一个来自字符串列表)我已经预先编码了。)其次,我希望它通过调用 checkanswer() 函数将比较显示为“对或错”,但是当我按下按钮并尝试让它调用不同的函数时,它会重复checkanswer() 的相同行为.. 即使我试图调用 nextcard() [在 print("correct") 情况下]

这让我想到了我的问题:每个 QPushButton 可以只做一个动作吗?我希望它在继续下一个单词之前通知用户(或强迫他们输入正确答案)。基本上我想要一个按钮在不同的时间调用 checkanswer() 函数和 nextword() 方法。

这是我的主窗口的代码。如果您需要更多信息,请告诉我,我会在此处添加。

class MainWindow(QtWidgets.QMainWindow):

    textvalue = ""
    cardnum = 0                                                     # intialize card number from 0
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)
        self.show()

    def checkanswer(self):
        textvalue = self.ui.lineEditAnswer.text()
        print("You entered: " + textvalue + " $? " + deck[self.cardnum].deflist[0])
        if textvalue == deck[self.cardnum].deflist[0]:
            print("Correct!")
            self.ui.lineEditAnswer.clear()
            textvalue = ""
            self.ui.labelVocab.setText("Correct!\n " + deck[self.cardnum].deflist[0])
            self.ui.pushButtonEnter.setText("Continue")
            self.ui.pushButtonEnter.clicked.connect(self.nextword)
        else:
            print("Incorrect!")
            print(self.cardnum)
            self.ui.lineEditAnswer.clear()
            self.ui.labelVocab.setText("Oops! Correct answer is: " + deck[self.cardnum].deflist[0])

    def nextword(self):
        self.cardnum += 1
        self.ui.lineEditAnswer.clear()
        self.ui.pushButtonEnter.setText("Enter")
        self.ui.labelVocab.setText(deck[self.cardnum].vocab)
        self.ui.pushButtonEnter.clicked.connect(self.checkanswer)

    if __name__ == "__main__":
        deck = parser.parser()
        app = QApplication(sys.argv)
        win = MainWindow()
        win.show()
        win.ui.labelVocab.setText(deck[MainWindow.cardnum].vocab)

        sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

Sch*_*eff 5

首先,Qt doc中有一个很好的介绍:

信号和插槽

我热烈推荐阅读。

在中间的某个地方,您会发现以下段落:

默认情况下,对于您建立的每个连接,都会发出一个信号;为重复连接发出两个信号。您可以通过一个disconnect()调用断开所有这些连接。如果您传递Qt::UniqueConnection类型,则只有在它不是重复的情况下才会建立连接。如果已经有重复(相同对象上完全相同的插槽的完全相同的信号),则连接将失败并且 connect 将返回false

我必须承认,我不知道单曲disconnect(). 通常,我存储信号处理程序的连接,connect()当我打算稍后断开它时返回该连接。此外,Qt 还允许通过中给出的相同参数断开处理程序,connect()但我从未使用过它。

这是我用于摆弄的小 Python 示例:

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

app = QApplication(sys.argv)
qBtn1 = QPushButton("Click me")
qBtn1.show()

def onBtn1Clicked():
  print("onBtn1Clicked")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me again")
  qBtn1.clicked.connect(onBtn1ClickedAgain)

def onBtn1ClickedAgain():
  print("onBtn1ClickedAgain")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me")
  qBtn1.clicked.connect(onBtn1Clicked)

qBtn1.clicked.connect(onBtn1Clicked)
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

信号处理程序onBtn1Clicked()onBtn1ClickedAgain()连接彼此互斥。

在 Windows 10 上的cygwin64 中测试:

#!/usr/bin/python3

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPushButton

app = QApplication(sys.argv)
qBtn1 = QPushButton("Click me")
qBtn1.show()

def onBtn1Clicked():
  print("onBtn1Clicked")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me again")
  qBtn1.clicked.connect(onBtn1ClickedAgain)

def onBtn1ClickedAgain():
  print("onBtn1ClickedAgain")
  qBtn1.clicked.disconnect()
  qBtn1.setText("Click me")
  qBtn1.clicked.connect(onBtn1Clicked)

qBtn1.clicked.connect(onBtn1Clicked)
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)

testQPushButton.py 的快照 单击按钮后 testQPushButton.py 的快照

关于信号处理程序的多次调用,我建议如下:qBtn1.clicked.disconnect()在两个处理程序中注释该行,看看会发生什么(在控制台上)。