从PyQt中的QPushButton获取文本

gho*_*nsd 3 python qt pyqt pyqt4 qt-signals

我正在尝试从QtGui.QPushButton对象列表创建一个简单的键盘。

class XKeyboard(QtGui.QWidget):
  '''Special virtual keyboard for any language.'''
  def __init__(self, parent=None):
    QtGui.QWidget.__init__(self, parent)
    self.MainLayout = QtGui.QVBoxLayout()
    self.TextEntry = QtGui.QTextEdit()
    self.Keyboard = QtGui.QVBoxLayout()
    self.MainLayout.addWidget(self.TextEntry)
    self.MainLayout.addLayout(self.Keyboard)
    self.setLayout(self.MainLayout)

  def addRow(self, keys):
    layout = QtGui.QHBoxLayout()
    buttons = [QtGui.QPushButton(unicode(key)) for key in keys]
    for button in buttons:
      key = keys[buttons.index(button)]
      layout.addWidget(button)
      button.clicked.connect(
          lambda key: self.keyClick(key))
      self.keyClick(key)
    self.Keyboard.addLayout(layout)

  def keyClick(self, key):
    self.TextEntry.insertPlainText(key)
Run Code Online (Sandbox Code Playgroud)

问题是lambda返回False而不是键。我究竟做错了什么?

Ava*_*ris 5

lambda

lambda key: self.keyClick(key)
Run Code Online (Sandbox Code Playgroud)

等效于此:

def dummy(key):
    self.keyClick(key)
Run Code Online (Sandbox Code Playgroud)

因此,基本上,您从clickedsignal 接受一个参数,该参数返回 checked按钮的状态,这是False因为您没有可检查的按钮,并将其传递给keyClick方法。keyClick方法key在for循环中不接收参数。

可能的解决方案是编写您lambda接受的两个参数,其中一个具有预期值的默认值:

lambda checked, key=key: self.keyClick(key)
Run Code Online (Sandbox Code Playgroud)

为什么需要做的key=key是一个完全不同的主题。来自相关主题的特定答案(以及其他答案)可能会对此有所启发。