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.

Asked By: sławomir sowa

||

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()
Answered By: WhoKnowsMe
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.