Python 从PyQt中的QPushButton获取文本
我正试图从QtGui.QPushButton对象列表中创建一个简单的键盘Python 从PyQt中的QPushButton获取文本,python,qt,pyqt,pyqt4,qt-signals,Python,Qt,Pyqt,Pyqt4,Qt Signals,我正试图从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.Tex
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。我做错了什么?那lambda
:
lambda key: self.keyClick(key)
相当于:
def dummy(key):
self.keyClick(key)
因此,基本上您是从clicked
signal接受一个参数,该参数检查了按钮的状态,它是False
,因为您没有可检查的按钮,并将其传递给keyClick
方法keyClick
方法在for循环中不接收key
参数
可能的解决方案是编写lambda
接受两个参数,其中一个参数的默认值为预期值:
lambda checked, key=key: self.keyClick(key)
你为什么需要做key=key
是一个完全不同的主题。(与其他答案一起)相关主题可能会对此有所启发。正确的方法是使用a,它正是针对这种情况设计的
这里有一种重新编写示例以使用它的方法:
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))
是的,伙计,这很有效!只有一个问题:如果我生成的信号不返回任何状态(如triggered()),我是否仍然需要lambda checked,key=key,或者我可以写lambda key=key?@ghostmansd:您应该(而不是“可以”)写lambda key=key
,否则您将得到一个异常并声明参数不足。我将选中的放在那里,因为您需要放弃从单击的传递的参数。