【问题标题】:Getting a QPushButton to perform 2 actions?让 QPushButton 执行 2 个操作?
【发布时间】:2019-04-26 01:06:43
【问题描述】:

前言:我正在开发 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_())

【问题讨论】:

  • 我能够通过检查是否有输入并仅在 textvalue != "" 时运行 checkanswer() 函数来使其工作,但这并没有改变这样一个事实,即每次推送按钮将导致它调用该函数。有没有办法解决这个问题?
  • 每个 QPushButton 可以只做一个动作吗? 不可以。您可以将多个信号处理程序连接到每个信号(包括按钮的clicked)。如果要替换信号处理程序,则必须在连接新的之前断开旧的。
  • 这很有意义,而且似乎奏效了。我希望您将其发布为答案,以便我可以将其标记为答案。我不敢相信我没有考虑过断开连接。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    Signals & Slots

    我强烈推荐阅读。

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

    默认情况下,对于您建立的每个连接,都会发出一个信号;为重复连接发出两个信号。您可以通过一个 disconnect() 调用来中断所有这些连接。如果您传递Qt::UniqueConnection 类型,则只有在不重复的情况下才会建立连接。如果已经存在重复(完全相同的信号到相同对象上完全相同的插槽),则连接将失败,并且连接将返回 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() 相互连接,互斥。

    在 Windows 10 上的 cygwin64 中测试:

    $ /usr/bin/python3 --version
    Python 3.6.4
    
    $ ./testQPushButton.py
    onBtn1Clicked
    onBtn1ClickedAgain
    onBtn1Clicked
    onBtn1ClickedAgain
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-11
      • 1970-01-01
      • 2014-07-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 2015-06-14
      • 2013-10-16
      相关资源
      最近更新 更多