PyQt:获取调用特定函数的按钮

3
我已经在PyQt中制作了一个多页面应用程序,通常是一个问答游戏。因此,每当用户答错或者回答正确时,它会调用正确/错误的函数。

错误答案函数:

def incorrect(self):
    self.pic3.hide()
    self.que1.hide()
    self.answ.hide()
    self.answ1.hide()
    self.answ2.hide()
    self.pic4.setGeometry(0, 0, 1280, 800)
    self.pic4.show()
    self.goback.show() 
    self.cont = QtGui.QPushButton(self)
    self.cont.setObjectName('cont')
    self.cont.setStyleSheet("#cont {background-image: url(':/images/Continue.png'); border: none; }"
    "#cont:hover { background-image: url(':/images/Continue1.png'); }"
    "#cont:pressed { background-image: url(':/images/Continue2.png'); }")
    self.cont.setGeometry(980, 610, 300, 300)
    self.cont.clicked.connect(self.question2)
    self.cont.show()
    self.heart2.hide()
    #self.heart1.hide()
    if ( self.heart2.isHidden() and self.heart1.isHidden() ):
        gameover()
    else:
        pass

所以我将在此函数中创建多个“cont”小部件,目的是因为我希望它能够继续到特定的问题(如果用户在问题1上失败或成功,则应继续到问题2)。
但是为了实现这一点,需要编写代码来确定是否从button1button2调用了不正确的答案函数,当单击这两个按钮时,它们都连接到同一个插槽,如果是从button1调用的,则会显示cont推按钮,当单击时会显示问题2小部件(问题2页面)。
但是如果是从button2调用的,则会显示cont2推按钮,当单击时将显示问题3页面。 代码应该看起来像这样:
if self.connected from button1:
   cont.show()
if self.connected from button2:
   cont2.show()
else:
    pass

图片示例:

enter image description here


这不是重复的问题吗?http://stackoverflow.com/questions/3893876/pyqt-and-qsignalmapper-lambdas-multiple-signals-single-slot 或者 http://stackoverflow.com/questions/9966731/pyside-pyqt-simple-way-to-bind-multiple-buttons-that-shares-the-same-function - eric
@neuronet,这并不是一个“重复问题”,因为这些问题往往围绕着特定问题的目标而难以理解,我只是把它们变得更加通用和易于理解,使用图片、示例代码和一般性问题,这将对其他人也有所帮助。 - ShellRox
嗯...我还不太信服。你的回答似乎非常针对你正在解决的问题,而那些回答则能简洁地表达出一般性观点。我很难看出这里有什么独特之处。尤其是考虑到你接受的答案基本上是相同的... - eric
2个回答

8

使用sender()函数获取发送信号的QObject对象:

class Example(QMainWindow):

    def __init__(self):
        super().__init__()

        btn1 = QPushButton("Button 1", self)
        btn1.clicked.connect(self.buttonClicked) # connect signal to slot

        self.setWindowTitle('Event sender')
        self.show()

    def buttonClicked(self):
        sender = self.sender()  # This is what you need
        self.statusBar().showMessage(sender.text() + ' was pressed')

是的,但我该如何将它包含在布尔值中?这样它就可以确定它是来自btn_1还是btn_2。 - ShellRox
假设您有按钮对象:(sender == my_button) - paceholder

3
假设您的按钮分别命名为self.button1self.button2,您可以使用部分绑定函数来绑定事件处理程序:
from functools import partial
self.button1.clicked.connect(partial(self.question, self.button1))
self.button2.clicked.connect(partial(self.question, self.button2))

然后在你的question方法中再添加另一个参数,即:
def question(self, btn):
     if btn == self.button1:
         # Button 1 was clicked
     elif btn == self.button2:
         # Button 2 was clicked

它起作用了!但是它在控制台中一直给出这个错误 TypeError: incorrect() takes exactly 2 arguments (1 given),但我像这样定义了incorrect:def incorrect(self, sendercheck): - ShellRox
除了部分函数和发送者函数之外,您还可以使用非常方便的QSignalMapper。正如在评论中链接的潜在重复讨论中所讨论的那样。 - eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接