Получить текст из QPushButton в PyQt - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь создать простую клавиатуру из списка объектов 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)

Проблема в том, что лямбда возвращает False вместо ключа. Что я делаю не так?

Ответы [ 2 ]

4 голосов
/ 24 января 2012

То, что lambda:

lambda key: self.keyClick(key)

эквивалентно этому:

def dummy(key):
    self.keyClick(key)

Итак, в основном вы принимаете параметр из сигнала clicked, который возвращает checked состояние кнопки, и оно False, поскольку у вас нет кнопки с возможностью проверки, и вы передаете ее методу keyClick.keyClick метод не получает параметр key в цикле for.

Возможным решением будет запись вашего lambda, принимающего два параметра, один со значением по умолчанию вашего предполагаемого значения:

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

Почему вам нужно сделать key=key - это совсем другая тема. Этот конкретный ответ (вместе с другими ответами) по смежной теме может пролить на него некоторый свет.

3 голосов
/ 24 января 2012

Правильный способ сделать это - использовать 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))
...