PyQt:如何在编辑项目时获取QTableWidgetItem内容?

时间:2015-11-26 03:22:28

标签: pyqt4 qt-signals qtablewidgetitem

最后,我试图解决的问题是有人在QTableWidget中编辑字段,然后点击"确定"在按下回车键或将焦点从表格单元格中更改之前。

默认行为似乎是忽略此单元格,因为它没有"#34;#34;

这是一个简单的例子:

#!/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;然后点击" OK"如果没有先按下回车键或改变焦点,我会看到打印:

{'a': ''}

当我想看时:

{'a': 'b'}

我的想法是将单元格视为QLineEdit,并使用textChanged查看用户何时键入,然后在幕后,使用每个按键描边的单元格的setItem - 这个想法是单元格始终是最新的。我尝试使用QStyledItemDelegate(下面),以便它像QLineEdit(有一个textChanged信号)编辑。这在某种程度上起作用,因为我可以打印代表本身的变化,但我似乎无法在任何有用的地方获得textChanged信号(换句话说,对话框没有看到这个,因此它不能在表格中设置。)

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信号,但这也没有帮助。

在单元格仍处于编辑状态时,是否有办法获取单元格内容?

0 个答案:

没有答案