How to get an old_value from handleItemChanged on QTableWidget in PyQt5
Question:
I have a question related to QTableWidget and handleItemChanged.
Is there a way to get the before change and after the change values for comparison?
import sys
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# Create QTableWidget and add to QMainWindow
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Set column count and headers
self.table_widget.setColumnCount(3)
self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
# Set row count and items
self.table_widget.setRowCount(3)
self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
# Connect handleItemChanged to QTableWidget
self.table_widget.itemChanged.connect(self.handleItemChanged)
def handleItemChanged(self, item):
# Get row and column of edited item
row = item.row()
column = item.column()
# Get value before and after change
current_value = item.text()
previous_value = None # <--- is there a way to get a previous value
print(f'Edited row: {row}, column: {column}')
print(f'Previous value: {previous_value}')
print(f'Current value: {current_value}')
if current_value != previous_value:
print("Do something important here!")
def main():
app = QApplication(sys.argv)
table = MyWindow()
table.show()
app.exec_()
main()
If it’s not possible would you advise a solution?
Thank You very much for all your help.
Answers:
I don’t know if there is any other better way to do this than the following answer, but what I thought is that you could save the value before changing, and because for changing it you need to select the item first, you can handle that and store the data in that moment to use it when the item is changed.
If the item is not changed nothing happen because when you select another one to change it, it will override the value.
import sys
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# Create QTableWidget and add to QMainWindow
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Set column count and headers
self.table_widget.setColumnCount(3)
self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
# Set row count and items
self.table_widget.setRowCount(3)
self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
self.table_widget.itemPressed.connect(self.selectedItemValue)
# Connect handleItemChanged to QTableWidget
self.table_widget.itemChanged.connect(self.handleItemChanged)
def selectedItemValue(self, item):
self.previous_value = item.text()
def handleItemChanged(self, item):
# Get row and column of edited item
print(type(item))
row = item.row()
column = item.column()
# Get value before and after change
current_value = item.text()
previous_value = self.previous_value # <--- is there a way to get a previous value
print(f'Edited row: {row}, column: {column}')
print(f'Previous value: {previous_value}')
print(f'Current value: {current_value}')
if current_value != previous_value:
print("Do something important here!")
def main():
app = QApplication(sys.argv)
table = MyWindow()
table.show()
app.exec_()
main()
I have a question related to QTableWidget and handleItemChanged.
Is there a way to get the before change and after the change values for comparison?
import sys
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# Create QTableWidget and add to QMainWindow
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Set column count and headers
self.table_widget.setColumnCount(3)
self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
# Set row count and items
self.table_widget.setRowCount(3)
self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
# Connect handleItemChanged to QTableWidget
self.table_widget.itemChanged.connect(self.handleItemChanged)
def handleItemChanged(self, item):
# Get row and column of edited item
row = item.row()
column = item.column()
# Get value before and after change
current_value = item.text()
previous_value = None # <--- is there a way to get a previous value
print(f'Edited row: {row}, column: {column}')
print(f'Previous value: {previous_value}')
print(f'Current value: {current_value}')
if current_value != previous_value:
print("Do something important here!")
def main():
app = QApplication(sys.argv)
table = MyWindow()
table.show()
app.exec_()
main()
If it’s not possible would you advise a solution?
Thank You very much for all your help.
I don’t know if there is any other better way to do this than the following answer, but what I thought is that you could save the value before changing, and because for changing it you need to select the item first, you can handle that and store the data in that moment to use it when the item is changed.
If the item is not changed nothing happen because when you select another one to change it, it will override the value.
import sys
from PyQt5.QtCore import *
from PyQt5 import QtCore
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
# Create QTableWidget and add to QMainWindow
self.table_widget = QTableWidget(self)
self.setCentralWidget(self.table_widget)
# Set column count and headers
self.table_widget.setColumnCount(3)
self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
# Set row count and items
self.table_widget.setRowCount(3)
self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
self.table_widget.itemPressed.connect(self.selectedItemValue)
# Connect handleItemChanged to QTableWidget
self.table_widget.itemChanged.connect(self.handleItemChanged)
def selectedItemValue(self, item):
self.previous_value = item.text()
def handleItemChanged(self, item):
# Get row and column of edited item
print(type(item))
row = item.row()
column = item.column()
# Get value before and after change
current_value = item.text()
previous_value = self.previous_value # <--- is there a way to get a previous value
print(f'Edited row: {row}, column: {column}')
print(f'Previous value: {previous_value}')
print(f'Current value: {current_value}')
if current_value != previous_value:
print("Do something important here!")
def main():
app = QApplication(sys.argv)
table = MyWindow()
table.show()
app.exec_()
main()