3

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問題は、キーの代わりにラムダが返されることです。私は何を間違っていますか?

4

2 に答える 2

5

それlambda

lambda key: self.keyClick(key)

これと同等です:

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

したがって、基本的には、ボタンの状態を返すclickedシグナルからパラメーターを受け取ります。これは、チェック可能なボタンがないためであり、それをメソッドに渡します。メソッドはfor ループでパラメーターを受け取りません。 checkedFalsekeyClickkeyClickkey

可能な解決策はlambda、意図した値のデフォルト値を持つ2つのパラメーターを受け入れることを書くことです:

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

なぜあなたがする必要があるのかkey=key​​ は、まったく別の主題です。関連する主題からのこの特定の回答(他の回答とともに)は、それに光を当てる可能性があります。

于 2012-01-23T22:48:13.133 に答える
3

これを行う正しい方法は、まさにこの状況のた​​めに設計されたQButtonGroupを使用することです。

これを使用するために例を書き直す 1 つの方法を次に示します。

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))
于 2012-01-23T23:05:05.607 に答える