【问题标题】:PySide : How to get the clicked QPushButton object in the QPushButton clicked slot?PySide:如何在 QPushButton 单击槽中获取单击的 QPushButton 对象?
【发布时间】:2013-12-02 03:18:45
【问题描述】:

我是 PySide 的新手。我想在其单击的插槽中获取 QPushButton obj(例如使用它来获取其文本)。

button = QtGui.QPushButton("start go")
button.clicked.connect(self.buttonClick)

def buttonClick(self):
    ... # How can I get the button  object?
    # print button.text()  how to get the text : 'start go' ?

谢谢!

【问题讨论】:

    标签: qt pyqt pyside qpushbutton


    【解决方案1】:

    您可以只使用self.sender() 来确定发起信号的对象。

    在您的代码中,类似的内容应该可以工作。

    button = QtGui.QPushButton("start go")
    button.clicked.connect(self.buttonClick)
    
    def buttonClick(self):
        print self.sender().text()
    

    【讨论】:

    • 我只是测试它,但它发出一个error
    • @tao4yu。示例代码应为:print self.sender().text()
    • 感谢@ekhumoro 我的复制/粘贴错误。
    【解决方案2】:

    这是我为解决问题所做的:

    button = QtGui.QPushButton("start go")
    button.clicked.connect(lambda: self.buttonClick(button))
    
    def buttonClick(self, button):
        print button.text()
    

    【讨论】:

    • +1。这可能是避免使用sender() 的最佳方式。但是,在循环中连接大量按钮时,像这样使用 lambda 可能会很棘手。
    • lambda 做什么?
    • 在 Python 中,lambda 创建一个匿名函数,更多信息在这里secnetix.de/olli/Python/lambda_functions.hawk
    • @qurban 我们可以在单独的 .py 文件中编写相同的内容吗,因为一旦我们在 QT 设计器中更改并从 .ui 转换为 .py 文件,主窗口文件就会发生变化
    【解决方案3】:

    通常,大多数小部件将在主窗口的设置代码中创建。最好始终将这些小部件添加为主窗口的属性,以便以后可以轻松访问它们:

    class MainWindow(QtGui.QMainWindow):
        def __init__(self, parent=None)
            super(MainWindow, self).__init__(parent)
            ...
            self.button = QtGui.QPushButton("start go")
            self.button.clicked.connect(self.buttonClick)
            ...
    
        def buttonClick(self):
            print(self.button.text())
    

    如果您有很多按钮都使用相同的处理程序,您可以将按钮添加到QButtonGroup,并将处理程序连接到其buttonClicked 信号。该信号可以发送单击的按钮或您自己指定的标识符。

    还有可能使用self.sender() 来获取对发送信号的对象的引用。然而,这有时被认为是不好的做法,因为它首先破坏了使用信号的主要原因(请参阅docs for sender 中的警告以了解更多信息)。

    【讨论】:

      【解决方案4】:

      我实际上想对答案 #1 中的评论发表评论,但还没有足够的声誉这样做:)。评论是“不过,在一个循环中连接大量按钮时,像这样使用 lambda 可能会很棘手。”这正是我找到此页面时需要做的。

      循环这样做是行不通的:

      for button in button_list :
          button.clicked().connect( lambda: self.buttonClick( button )
      

      您的回调将始终使用 button_list 中的最后一个按钮调用(为什么请参阅我刚刚发现的此页面上的信息 - https://blog.mister-muffin.de/2011/08/14/python-for-loop-scope-and-nested-functions

      改为这样做,它可以工作:

      for button in button_list :
          button.clicked().connect( lambda b=button: self.buttonClick( b ))
      

      【讨论】:

      • 这里可能有一个问题,但是... 作为一个局部变量,小部件的 c++ 对象可能在调用回调时已被删除。现在遇到这个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2018-04-25
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多