最后,我要解决的问题是有人在 a 中编辑字段,QTableWidget
然后单击“确定”,然后再按 Enter 键或将焦点从表格单元格中移出。
默认行为似乎是忽略此单元格,因为它尚未“提交”。
这是一个简单的例子:
#!/usr/bin/env python
import sys
import pprint
from PyQt4 import QtCore,QtGui
class Dialog(QtGui.QDialog):
def __init__(self,parent=None):
super(Dialog,self).__init__(parent)
self.table = QtGui.QTableWidget(5,2)
button_box = QtGui.QDialogButtonBox(QtGui.QDialogButtonBox.Ok|QtGui.QDialogButtonBox.Cancel)
button_box.accepted.connect(self.accept)
button_box.rejected.connect(self.reject)
layout = QtGui.QVBoxLayout()
layout.addWidget(self.table)
layout.addWidget(button_box)
self.setLayout(layout)
def accept(self):
ret = {}
for i in range(self.table.rowCount()):
k = self.table.item(i,0)
v = self.table.item(i,1)
if not k:
continue
if k.text().isEmpty():
continue
if not v:
v = QtGui.QTableWidgetItem("")
ret[str(k.text())] = str(v.text())
pprint.pprint(ret)
def main():
app = QtGui.QApplication(sys.argv)
main = Dialog()
main.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
在此示例中,如果我输入a
第一个单元格,则输入b
第二个单元格;然后单击“确定”而不先按回车键或更改焦点,我将看到打印:
{'a': ''}
当我想看时:
{'a': 'b'}
我的一个想法是将单元格视为 QLineEdit 并使用 textChanged 来查看用户何时键入,然后在幕后使用每个击键来设置单元格的 setItem - 想法是单元格中的数据是始终保持最新。我通过使用QStyledItemDelegate
(如下)尝试了此操作,以便它像 QLineEdit(具有 textChanged 信号)一样进行编辑。这在某种程度上有效,因为我可以打印出委托本身的更改,但我似乎无法在任何有用的地方获得 textChanged 信号(换句话说,对话框没有看到这个,因此它不能表中的 setItem)。
class LineEditDelegate(QtGui.QStyledItemDelegate):
textChanged = QtCore.pyqtSignal(str)
def createEditor(self, parent, option, index):
editor = QtGui.QLineEdit(parent)
editor.textChanged.connect(self.textChanged)
return editor
但这不是诀窍。
我还尝试在 QLineEdit 的 textChanged 触发时发出 commitData 信号,但这也没有帮助。
有没有办法在单元格仍在编辑时获取单元格内容?