【问题标题】:Get text from QPushButton in PyQt从 PyQt 中的 QPushButton 获取文本
【发布时间】:2012-01-23 22:17:55
【问题描述】:

我正在尝试从 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。我做错了什么?

【问题讨论】:

    标签: python qt pyqt pyqt4 qt-signals


    【解决方案1】:

    那个lambda

    lambda key: self.keyClick(key)
    

    等价于:

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

    所以,基本上你正在接受来自clicked 信号的参数,其中returns checked 按钮的状态是False,因为你没有可检查按钮,并将其传递给keyClick 方法。 keyClick 方法在 for 循环中没有接收到 key 参数。

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

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

    为什么你需要做key=key 是一个完全不同的主题。来自相关主题的This particular answer(以及其他答案)可能会对此有所了解。

    【讨论】:

    • 是的,伙计,这行得通!只有一个问题:如果我生成不返回任何状态的信号(如 triggered()),我还需要 lambda checked, key=key 还是我可以写lambda key=key?
    • @ghostmansd:你应该(不是“可以”)写lambda key=key,否则你会得到参数不足的异常。我把checked放在那里是因为你需要丢弃从clicked传递的参数。
    【解决方案2】:

    正确的做法是使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2021-01-08
      • 2017-09-21
      • 2013-10-14
      • 2018-10-01
      • 2014-01-07
      相关资源
      最近更新 更多