Как получить отредактированную пользователем строку QTableWidget в PyQt5?

Я создаю программу, где пользователь, изменив значение клетки таблицы, изменяет ее значение в базе данных.

Проблема в том, что я не знаю, как получить строку, в которой находится измененная клетка.
Помогите, пожалуйста.

import sys


from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget, QWidget, QGridLayout


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.columns = ["Id", "Название", "Цена"]
        self.data = [
            [1, "Хлеб", 30],
            [2, "Сок", 35],
            [3, "Мороженое", 15]
        ]

        self.initUi()

    def initUi(self):
        central_widget = QWidget(self)         
        self.setCentralWidget(central_widget)  
 
        grid_layout = QGridLayout()            
        central_widget.setLayout(grid_layout)  

        table = QTableWidget(self)

        table.setColumnCount(3)
        table.setHorizontalHeaderLabels(self.columns)
        table.setRowCount(3)

        for i, row in enumerate(self.data):
            for j, column in enumerate(row):
                table.setItem(i, j, QTableWidgetItem(str(column)))

        table.resizeColumnsToContents()

        grid_layout.addWidget(table, 0, 0)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())


Ответы (3 шт):

Автор решения: Vladislav_Rosch

Создай отдельную переменную, которая принимает значение из виджета клетки. Примерно Так:

Variable1 = tableVariable.get()

Поправь меня, если я неправильно понял вопрос

→ Ссылка
Автор решения: Anaconda

Может быть Вам сделать вверху надпись с помощью переменной и QLabel, а внизу поле для ввода текста. Что то вроде: если пользователь вводит текст и нажимает Enter, то label = новый_текст.

→ Ссылка
Автор решения: S. Nick

void QTableWidget::cellChanged(int row, int column)

Этот сигнал излучается всякий раз, когда данные элемента в ячейке, указанной строкой и столбцом, изменились.

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtWidgets import QTableWidgetItem, QTableWidget, QWidget, \
    QGridLayout


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.columns = ["Id", "Название", "Цена"]
        self.data = [
            [1, "Хлеб", 30],
            [2, "Сок", 35],
            [3, "Мороженое", 15]
        ]

        self.initUi()

    def initUi(self):
        central_widget = QWidget(self)         
        self.setCentralWidget(central_widget)  
 
        grid_layout = QGridLayout()            
        central_widget.setLayout(grid_layout)  

        self.table = QTableWidget(self)
        self.table.setColumnCount(3)
        self.table.setHorizontalHeaderLabels(self.columns)
        self.table.setRowCount(3)

        for i, row in enumerate(self.data):
            for j, column in enumerate(row):
                self.table.setItem(i, j, QTableWidgetItem(str(column)))

        self.table.resizeColumnsToContents()

        grid_layout.addWidget(self.table, 0, 0)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
        
        self.table.currentItemChanged.connect(self.current_item_changed) 
        self.table.cellChanged.connect(self.cell_changed)                

        self.current = None
        self.previous = None
        
    def cell_changed(self, row, column):
        print(f'\nИзменились данные элемента в ячейке, строка={row}, столбец={column}')
        print(f'В ячейке было={self.current}, '
              f'стало={self.table.currentItem().text()}')        

    def current_item_changed(self, current, previous):
        # print(f'current = {current}, previous = {previous}')
        self.current = current.text() if current else ''
        self.previous = previous.text() if previous else ''

if __name__ == '__main__':
    app = QApplication(sys.argv)

    window = Window()
    window.show()

    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка