Подходящим сигналом для этого случая является dataChanged, но этот сигнал выдается не только при изменении текста, но и при изменении других свойств, таких как состояние флажка.В PyQt5 / Qt5 к этому сигналу добавляется аргумент, который указывает, что он позволяет различать, но не относится к PyQt4.
Один из способов получения, если измененная роль соответствует тексту, состоит в сравнении текста переди после изменения, но QListWidgetItem сохраняет только один текст, поэтому для сохранения старого текста должна использоваться другая роль.С этой логикой я реализовал следующее решение:
from PyQt4 import QtCore, QtGui
class ListWidget(QtGui.QListWidget):
textItemChanged = QtCore.pyqtSignal(QtGui.QListWidgetItem)
OLDTEXTROLE = QtCore.Qt.UserRole + 1000
def __init__(self, parent=None):
super(ListWidget, self).__init__(parent)
self.model().dataChanged.connect(self.on_data_changed)
@QtCore.pyqtSlot(QtCore.QModelIndex, QtCore.QModelIndex)
def on_data_changed(self, topLeft, bottomRight):
if topLeft == bottomRight:
it = self.itemFromIndex(topLeft)
old_text = it.data(ListWidget.OLDTEXTROLE)
if old_text is None:
it.setData(ListWidget.OLDTEXTROLE, "")
if old_text == it.text():
return
self.textItemChanged.emit(it)
it.setData(ListWidget.OLDTEXTROLE, it.text())
class Dialog(QtGui.QDialog):
def __init__(self, parent=None):
super(Dialog, self).__init__()
self.listWidget = ListWidget()
items = ["One", "Two", "Trhee"]
for item in items:
self.listWidget.addItem(item)
for index in range(self.listWidget.count()):
item = self.listWidget.item(index)
item.setFlags(
item.flags()
| QtCore.Qt.ItemIsUserCheckable
| QtCore.Qt.ItemIsEditable
)
item.setCheckState(QtCore.Qt.Checked)
self.listWidget.textItemChanged.connect(self.on_text_item_changed)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.listWidget)
@QtCore.pyqtSlot(QtGui.QListWidgetItem)
def on_text_item_changed(self, it):
current_text = it.text()
old_text = it.data(ListWidget.OLDTEXTROLE)
print("old_text: {}, current_text: {}".format(old_text, current_text))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
window = Dialog()
window.setGeometry(600, 100, 300, 200)
window.show()
sys.exit(app.exec_())