pyqt中tableWidget双击修改单元格数据,失焦后获取修改的数据
时间: 2024-03-05 20:47:59 浏览: 41
可以通过以下步骤实现:
1. 在tableWidget上安装一个双击事件过滤器,当双击单元格时触发相应的信号,例如`cellDoubleClicked(int row, int column)`。
2. 在该信号的槽函数中,获取当前双击的单元格的数据,例如:
```python
def handle_cell_double_clicked(self, row, column):
item = self.tableWidget.item(row, column)
if item is not None:
self.current_data = item.text()
```
这里使用`QTableWidget`的`item()`方法获取单元格的`QTableWidgetItem`,然后获取其文本数据。
3. 在单元格失焦后,获取修改后的数据,例如:
```python
def handle_cell_lost_focus(self):
if self.current_item is not None:
new_data = self.current_item.text()
# 处理新数据...
```
这里可以在`QTableWidget`上安装失焦事件过滤器,当焦点离开单元格时触发相应的信号,例如`cellChanged(int row, int column)`。在该信号的槽函数中,获取当前单元格的新数据,并进行相应的处理。
完整的示例代码如下:
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.tableWidget = QTableWidget(self)
self.tableWidget.setRowCount(2)
self.tableWidget.setColumnCount(2)
self.tableWidget.setHorizontalHeaderLabels(['Name', 'Age'])
for i in range(2):
for j in range(2):
item = QTableWidgetItem(f'Row {i}, Column {j}')
self.tableWidget.setItem(i, j, item)
self.tableWidget.installEventFilter(self)
self.tableWidget.cellChanged.connect(self.handle_cell_lost_focus)
def eventFilter(self, obj, event):
if obj == self.tableWidget and event.type() == QEvent.MouseButtonDblClick:
index = self.tableWidget.indexAt(event.pos())
if index.isValid():
self.handle_cell_double_clicked(index.row(), index.column())
return super().eventFilter(obj, event)
def handle_cell_double_clicked(self, row, column):
item = self.tableWidget.item(row, column)
if item is not None:
self.current_item = item
self.current_data = item.text()
def handle_cell_lost_focus(self, row, column):
if self.current_item is not None and row == self.current_item.row() and column == self.current_item.column():
new_data = self.current_item.text()
# 处理新数据...
self.current_item = None
if __name__ == '__main__':
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```