从PyQ中的QPushButton获取文本

2024-06-07 13:42:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从列表中创建一个简单的键盘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)

问题是lambda返回False而不是key。我做错什么了?在


Tags: keyselffordefbuttonkeyslayoutqtgui
2条回答

lambda

lambda key: self.keyClick(key)

相当于:

^{pr2}$

所以,基本上你接受了来自clicked信号的一个参数,这个参数是按钮的returnschecked状态,因为你没有可检查的按钮,所以它是{},并将其传递给keyClick方法。keyClick方法在for循环中没有接收key参数。在

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

lambda checked, key=key: self.keyClick(key)

为什么你需要做key=key是一个完全不同的主题。^来自相关主题的{a2}(以及其他答案)可能会对它有所启示。在

正确的方法是使用QButtonGroup,它正是为这种情况而设计的。在

下面是一种重新编写示例以使用它的方法:

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)
    self.buttonGroup = QtGui.QButtonGroup(self)
    self.buttonGroup.buttonClicked[int].connect(self.keyClick)

  def addRow(self, keys):
    layout = QtGui.QHBoxLayout()
    for key in keys:
        key = unicode(key)
        button = QtGui.QPushButton(key)
        self.buttonGroup.addButton(button, ord(key))
        layout.addWidget(button)
    self.Keyboard.addLayout(layout)

  def keyClick(self, key):
    self.TextEntry.insertPlainText(unichr(key))

相关问题 更多 >

    热门问题