让QPushButton执行2个操作?

时间:2018-11-23 12:01:10

标签: python python-3.x qt user-interface pyqt5

前言:我正在PyQt5中开发一个抽认卡应用程序,并且我试图让“ Enter”按钮通过调用一个函数来比较2个字符串(其中一个来自textEdit框,另一个来自列表)第二,我希望它通过调用checkanswer()函数将比较显示为“对还是错”,但是当我按下按钮并尝试让它调用另一个函数时,它会即使我试图在print(“ correct”)情况下调用nextcard(),也会从checkanswer()重复相同的行为。

这带给我的问题是:每个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_())

2 个答案:

答案 0 :(得分:3)

首先,在Qt文档中有一个很好的介绍:

Signals & Slots

我强烈建议阅读。

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

  

默认情况下,对于您进行的每个连接,都会发射一个信号。发出两个信号以进行重复连接。您可以通过单个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_())

信号处理程序onBtn1Clicked()onBtn1ClickedAgain()相互排斥。

cygwin64的Windows 10上进行了测试:

$ /usr/bin/python3 --version
Python 3.6.4

$ ./testQPushButton.py
onBtn1Clicked
onBtn1ClickedAgain
onBtn1Clicked
onBtn1ClickedAgain

Snapshot of testQPushButton.py Snapshot of testQPushButton.py after clicking button

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

答案 1 :(得分:1)

正如注释中指出的 Scheff 一样,您可以调用pushButton.disconnect()方法,然后将clicked连接到另一个操作。 这是我固定代码的方式:

self.ui.pushButtonEnter.disconnect() self.ui.pushButtonEnter.clicked.connect(self.checkanswer)