如何在PyQt5的QTableWidget的handleItemChanged中获取旧值。

huangapple go评论99阅读模式
英文:

How to get an old_value from handleItemChanged on QTableWidget in PyQt5

问题

handleItemChanged函数中,您可以获取编辑的项目的当前值,但要获取先前的值,您可以使用一个字典来存储项目的先前值。以下是您可以将其添加到代码中的修改部分:

  1. class MyWindow(QMainWindow):
  2. def __init__(self):
  3. # ... 其他代码不变 ...
  4. # Create a dictionary to store previous values
  5. self.previous_values = {}
  6. # Connect handleItemChanged to QTableWidget
  7. self.table_widget.itemChanged.connect(self.handleItemChanged)
  8. def handleItemChanged(self, item):
  9. # Get row and column of edited item
  10. row = item.row()
  11. column = item.column()
  12. # Get current value
  13. current_value = item.text()
  14. # Get previous value from the dictionary
  15. previous_value = self.previous_values.get((row, column), None)
  16. print(f'Edited row: {row}, column: {column}')
  17. print(f'Previous value: {previous_value}')
  18. print(f'Current value: {current_value}')
  19. if current_value != previous_value:
  20. print("Do something important here!")
  21. # Update the previous value in the dictionary
  22. self.previous_values[(row, column)] = current_value

通过这种方式,您将能够在handleItemChanged函数中跟踪先前值和当前值,以进行比较。

英文:

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?

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5 import QtCore
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtWidgets import *
  6. class MyWindow(QMainWindow):
  7. def __init__(self):
  8. super().__init__()
  9. # Create QTableWidget and add to QMainWindow
  10. self.table_widget = QTableWidget(self)
  11. self.setCentralWidget(self.table_widget)
  12. # Set column count and headers
  13. self.table_widget.setColumnCount(3)
  14. self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
  15. # Set row count and items
  16. self.table_widget.setRowCount(3)
  17. self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
  18. self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
  19. self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
  20. self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
  21. self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
  22. self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
  23. self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
  24. self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
  25. self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
  26. # Connect handleItemChanged to QTableWidget
  27. self.table_widget.itemChanged.connect(self.handleItemChanged)
  28. def handleItemChanged(self, item):
  29. # Get row and column of edited item
  30. row = item.row()
  31. column = item.column()
  32. # Get value before and after change
  33. current_value = item.text()
  34. previous_value = None # <--- is there a way to get a previous value
  35. print(f'Edited row: {row}, column: {column}')
  36. print(f'Previous value: {previous_value}')
  37. print(f'Current value: {current_value}')
  38. if current_value != previous_value:
  39. print("Do something important here!")
  40. def main():
  41. app = QApplication(sys.argv)
  42. table = MyWindow()
  43. table.show()
  44. app.exec_()
  45. main()

If it's not possible would you advise a solution?

Thank You very much for all your help.

答案1

得分: 1

我不知道是否有其他更好的方法来完成这个任务,但我认为你可以在更改值之前保存该值。因为要更改它,你需要先选择该项,所以你可以处理选择操作,并在那一刻存储数据,以便在更改项目时使用。

如果项目没有更改,什么都不会发生,因为当你选择另一个项目进行更改时,它将覆盖该值。

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5 import QtCore
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtWidgets import *
  6. class MyWindow(QMainWindow):
  7. def __init__(self):
  8. super().__init__()
  9. # 创建 QTableWidget 并添加到 QMainWindow
  10. self.table_widget = QTableWidget(self)
  11. self.setCentralWidget(self.table_widget)
  12. # 设置列数和表头
  13. self.table_widget.setColumnCount(3)
  14. self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
  15. # 设置行数和项目
  16. self.table_widget.setRowCount(3)
  17. self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
  18. self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
  19. self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
  20. self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
  21. self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
  22. self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
  23. self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
  24. self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
  25. self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
  26. self.table_widget.itemPressed.connect(self.selectedItemValue)
  27. # 连接 handleItemChanged 到 QTableWidget
  28. self.table_widget.itemChanged.connect(self.handleItemChanged)
  29. def selectedItemValue(self, item):
  30. self.previous_value = item.text()
  31. def handleItemChanged(self, item):
  32. # 获取编辑项目的行和列
  33. row = item.row()
  34. column = item.column()
  35. # 获取更改前后的值
  36. current_value = item.text()
  37. previous_value = self.previous_value
  38. print(f'编辑的行: {row}, 列: {column}')
  39. print(f'之前的值: {previous_value}')
  40. print(f'当前的值: {current_value}')
  41. if current_value != previous_value:
  42. print("在这里执行重要操作!")
  43. def main():
  44. app = QApplication(sys.argv)
  45. table = MyWindow()
  46. table.show()
  47. app.exec_()
  48. main()

这是你提供的代码的翻译部分。

英文:

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.

  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5 import QtCore
  4. from PyQt5.QtGui import *
  5. from PyQt5.QtWidgets import *
  6. class MyWindow(QMainWindow):
  7. def __init__(self):
  8. super().__init__()
  9. # Create QTableWidget and add to QMainWindow
  10. self.table_widget = QTableWidget(self)
  11. self.setCentralWidget(self.table_widget)
  12. # Set column count and headers
  13. self.table_widget.setColumnCount(3)
  14. self.table_widget.setHorizontalHeaderLabels(['Name', 'Age', 'Gender'])
  15. # Set row count and items
  16. self.table_widget.setRowCount(3)
  17. self.table_widget.setItem(0, 0, QTableWidgetItem('John'))
  18. self.table_widget.setItem(0, 1, QTableWidgetItem('30'))
  19. self.table_widget.setItem(0, 2, QTableWidgetItem('Male'))
  20. self.table_widget.setItem(1, 0, QTableWidgetItem('Mary'))
  21. self.table_widget.setItem(1, 1, QTableWidgetItem('25'))
  22. self.table_widget.setItem(1, 2, QTableWidgetItem('Female'))
  23. self.table_widget.setItem(2, 0, QTableWidgetItem('Bob'))
  24. self.table_widget.setItem(2, 1, QTableWidgetItem('40'))
  25. self.table_widget.setItem(2, 2, QTableWidgetItem('Male'))
  26. self.table_widget.itemPressed.connect(self.selectedItemValue)
  27. # Connect handleItemChanged to QTableWidget
  28. self.table_widget.itemChanged.connect(self.handleItemChanged)
  29. def selectedItemValue(self, item):
  30. self.previous_value = item.text()
  31. def handleItemChanged(self, item):
  32. # Get row and column of edited item
  33. print(type(item))
  34. row = item.row()
  35. column = item.column()
  36. # Get value before and after change
  37. current_value = item.text()
  38. previous_value = self.previous_value # <--- is there a way to get a previous value
  39. print(f'Edited row: {row}, column: {column}')
  40. print(f'Previous value: {previous_value}')
  41. print(f'Current value: {current_value}')
  42. if current_value != previous_value:
  43. print("Do something important here!")
  44. def main():
  45. app = QApplication(sys.argv)
  46. table = MyWindow()
  47. table.show()
  48. app.exec_()
  49. main()

huangapple
  • 本文由 发表于 2023年3月9日 18:38:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/75683437.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定