从 PyQt 中的 QPushButton 获取文本
Posted
技术标签:
【中文标题】从 PyQt 中的 QPushButton 获取文本【英文标题】:Get text from QPushButton in PyQt 【发布时间】: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。我做错了什么?
【问题讨论】:
【参考方案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))
【讨论】:
以上是关于从 PyQt 中的 QPushButton 获取文本的主要内容,如果未能解决你的问题,请参考以下文章
PyQt4:使用 QPushButton 小部件从 QList 小部件中删除项目
如何在 PyQt 中获取按钮或标签(QPushButton、QLabel)的背景颜色