Как получить отредактированную пользователем строку 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 шт):
Создай отдельную переменную, которая принимает значение из виджета клетки. Примерно Так:
Variable1 = tableVariable.get()
Поправь меня, если я неправильно понял вопрос
Может быть Вам сделать вверху надпись с помощью переменной и QLabel, а внизу поле для ввода текста. Что то вроде: если пользователь вводит текст и нажимает Enter, то label = новый_текст.
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_())
