Как добавлять и удалять строки в QTableWidget?
Есть код, в котором вставляется в первый столбец таблицы tableWidget_3 данные dataEdit .
Как сделать так чтобы по нажатию на кнопку «удалить строку» строка удалялась,
а по нажатию на «добавить» — строку добавлялась?
import sys from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QWidget, QLabel from PyQt5 import uic from PyQt5.QtWidgets import QMainWindow from PyQt5 import QtCore, QtWidgets from PyQt5.Qt import * class Widget(QMainWindow): def __init__(self): super().__init__() uic.loadUi("UI_lke2.ui", self) for row in range(self.tableWidget_3.rowCount()): date_from = QtWidgets.QDateTimeEdit() date_from.setDateTime( QtCore.QDateTime(QtCore.QDate(2021, 8, 26), QtCore.QTime(15, 0, 0)) ) self.tableWidget_3.setCellWidget(row, 0, date_from) for row in range(self.tableWidget_3.rowCount()): date_from = QDateTimeEdit() date_from.setDateTime( QDateTime(QDate(2021, 9, 2)) ) date_from.dateTimeChanged.connect( lambda dateTime, row=row: self.date_changed(dateTime, row)) self.tableWidget_3.setCellWidget(row, 0, date_from) self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime() # . def date_changed(self, dateTime, row): if row == 0: self.dateTime0 = self.tableWidget_3.cellWidget(row, 0).dateTime() for row in range(1, self.tableWidget_3.rowCount()): dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) return dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) def buttonLoader(self): pass data_for_word = [] rows = self.tableWidget_3.rowCount() cols = self.tableWidget_3.columnCount() for row in range(rows): dateTime = self.tableWidget_3.cellWidget(row, 0). \ dateTime().toString('dd.MM.yyyy hh:mm') item = self.tableWidget_3.item(row, 1) _data = item.data(Qt.DisplayRole) data_for_word.append([dateTime, _data]) print(f'\n\n') print(*data_for_word, sep='\n') if __name__ == '__main__': app = QApplication(sys.argv) ex = Widget() ex.show() sys.exit(app.exec_())
Ответы (1 шт):
Я отметил для вас блок и строки, которые надо изменить.
Обратите внимание UI_lke2.ui, в нем не должно быть строк в таблице!
Таблица в Qt Designer содержит только столбцы! Строки добавляем через insertRow .
void QTableWidget:: insertRow (int row)
Вставляет пустую строку в таблицу в строке (int row).
import sys from PyQt5 import QtCore, QtWidgets, QtGui, uic from PyQt5.Qt import * class Widget(QMainWindow): def __init__(self): super().__init__() uic.loadUi("UI_lke2.ui", self) # . UI_lke2.ui изменен . # +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv self.tableWidget_3.horizontalHeader().setSectionResizeMode( QtWidgets.QHeaderView.Stretch) self.btn_add = QtWidgets.QPushButton('Add') self.btn_add.clicked.connect(self.add_row) self.btn_delete = QtWidgets.QPushButton("Delete") self.btn_delete.clicked.connect(self.delete_row) self.gridLayout.addWidget(self.tableWidget_3, 0, 0, 1, 2) self.gridLayout.addWidget(self.btn_add, 1, 0, 1, 1) self.gridLayout.addWidget(self.btn_delete, 1, 1, 1, 1) for _ in range(3): rowPosition = self.tableWidget_3.rowCount() self.tableWidget_3.insertRow(rowPosition) # . insertRow date_from = QtWidgets.QDateTimeEdit() dateTime = QtCore.QDateTime().currentDateTime() date_from.setDateTime(QtCore.QDateTime( QtCore.QDate(2021, 8, 26), QtCore.QTime(15, 0, 0) ) ) date_from.dateTimeChanged.connect( lambda dateTime, row=rowPosition: self.date_changed(dateTime, row)) self.tableWidget_3.setCellWidget(rowPosition, 0, date_from) self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime() self.date_changed(self.dateTime0, 0) self.btn_add.setFocus() def add_row(self): rowPosition = self.tableWidget_3.rowCount() self.tableWidget_3.insertRow(rowPosition) date_from = QtWidgets.QDateTimeEdit() dateTime = QtCore.QDateTime().currentDateTime() date_from.setDateTime(dateTime) date_from.dateTimeChanged.connect( lambda dateTime, row=rowPosition: self.date_changed(dateTime, row)) self.tableWidget_3.setCellWidget(rowPosition, 0, date_from) self.date_changed(dateTime, rowPosition) def delete_row(self): row = self.tableWidget_3.currentRow() if row == 0: QMessageBox.warning( self, "ВНИМАНИЕ", "НЕ НАДО УДАЛЯТЬ ПЕРВУЮ СТРОКУ!" ) return elif row == -1: msg = QMessageBox.question( self, 'Message', "Выберите строку, которую вы хотите удалить.", QMessageBox.Ok ) return else: msg = QMessageBox.question( self, "Внимание подтвердите удаление строки!", "Вы действительно хотите удалить " f"строку ?", QMessageBox.Ok | QMessageBox.Cancel ) if msg == QtWidgets.QMessageBox.Cancel: return for _row in range(self.tableWidget_3.rowCount()): date_from = self.tableWidget_3.cellWidget(_row, 0) date_from.dateTimeChanged.disconnect() self.tableWidget_3.removeRow(row) for _row in range(self.tableWidget_3.rowCount()): date_from = self.tableWidget_3.cellWidget(_row, 0) date_from.dateTimeChanged.connect( lambda dateTime, row=_row: self.date_changed(dateTime, row)) self.btn_add.setFocus() # +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ def date_changed(self, dateTime, row): if not self.tableWidget_3.cellWidget(row, 0): # +++ return # +++ if row == 0: self.dateTime0 = self.tableWidget_3.cellWidget(row, 0).dateTime() for row in range(1, self.tableWidget_3.rowCount()): dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) return dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime() item = QTableWidgetItem() item.setData(Qt.DisplayRole, self.dateTime0.secsTo(dateTime2) / 60. / 60.) self.tableWidget_3.setItem(row, 1, item) def buttonLoader(self): pass data_for_word = [] rows = self.tableWidget_3.rowCount() cols = self.tableWidget_3.columnCount() for row in range(rows): dateTime = self.tableWidget_3.cellWidget(row, 0). \ dateTime().toString('dd.MM.yyyy hh:mm') item = self.tableWidget_3.item(row, 1) _data = item.data(Qt.DisplayRole) data_for_word.append([dateTime, _data]) print(f'\n\n') print(*data_for_word, sep='\n') if __name__ == '__main__': app = QApplication(sys.argv) app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold)) ex = Widget() ex.resize(500, 400) ex.show() sys.exit(app.exec_())
MainWindow 0 0 320 240 MainWindow -
1 2 0 0 320 21
PyQT Table Add Row Data Dynamically: A Beginner Guide – PyQT Tutorial
We have known how to save data into a table in pyqt. Here is an example:
However, these data is not saved row by row. To address this issue, we will write an example to how to add data in pyqt table row by row in this tutorial.
Create a pyqt table
We first create a table without any data.
import sys from PyQt5.QtWidgets import QApplication, QWidget,QPushButton, QHBoxLayout, QVBoxLayout from PyQt5.QtWidgets import QLineEdit from PyQt5.QtWidgets import QTableWidget,QTableWidgetItem from PyQt5 import QtCore class YuTextFrame(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('PyQT Table Add Row Data Dynamically') vbox = QVBoxLayout() # add table table = QTableWidget(self) table.setColumnCount(5) table.rowCount() #set table header table.setHorizontalHeaderLabels(['id','Name','Age','Sex','Address']) #add data row_1 = ['001', 'John', 30, 'Male', 'Street No 2'] row_2 = ['002', 'Lily', 32, 'Female', 'Street No 1'] row_3 = ['003', 'Kate', 20, 'Male', 'Street No 3'] row_4 = ['004', 'Tom', 22, 'Male', 'Street No 4'] vbox.addWidget(table) self.setLayout(vbox) self.setGeometry(300,400,500,400) self.show() if __name__ == '__main__': app = QApplication(sys.argv) frame = YuTextFrame() sys.exit(app.exec_())
In code above, we only set table column is 5 and does not set the row count. Then, we will add 4 row data into this table.
You will find this table likes:
Add data row by row
To add data row by row, we should change the row count dynamically.
row = table.rowCount() table.setRowCount(row+1)
Then we we can add a row data.
We will create a function to add data row by row.
def addTableRow(self, table, row_data): row = table.rowCount() table.setRowCount(row+1) col = 0 for item in row_data: cell = QTableWidgetItem(str(item)) table.setItem(row, col, cell) col += 1
In this code, we will add a row data into pyqt table, row_data is python list which contains the value of each cell in row.
How to use addTableRow()
self.addTableRow(table, row_1) self.addTableRow(table, row_2) self.addTableRow(table, row_3) self.addTableRow(table, row_4)
Run this code, we will get effect likes:
Как добавить строку в таблицу виджета PyQT?
В настоящее время я работаю над виджетами, которые были разработаны в Qt Designer. У меня возникают проблемы с синтаксисом/общей концепцией попытки добавить строку в Qtable в PyQT. Нет метода, который я еще обнаружил для динамического добавления строк. Любые предложения будут полезны. Привет
4 ответа
Вы можете добавить пустую строку, а затем заполнить все столбцы. Вот как вставить строку под все остальные строки:
rowPosition = self.table.rowCount() table.insertRow(rowPosition)
после этого у вас есть пустая строка, которую вы можете заполнить, например, (если у вас есть 3 столбца):
table.setItem(rowPosition , 0, QtGui.QTableWidgetItem("text1")) table.setItem(rowPosition , 1, QtGui.QTableWidgetItem("text2")) table.setItem(rowPosition , 2, QtGui.QTableWidgetItem("text3"))
По какой-то причине мне пришлось также сделать table.setColumnCount (3), чтобы сделать содержимое таблицы видимым. (может быть потому, что я использую PyQt5)
Это несколько своеобразно, я нашел. Чтобы вставить строку, вы должны следовать следующему:
tableWidget = QTableWidget() currentRowCount = tableWidget.rowCount() #necessary even when there are no rows in the table tableWidget.insertRow(currentRowCount, 0, QTableWidgetItem("Some text"))
Чтобы прояснить последнюю строку кода, первым параметром insertRow() является текущая строка, вторая — текущий столбец (помните, что он всегда основан на 0), а третий должен быть почти всегда типа QTableWidgetItem ).
Не работает . Ошибка типа: QTableWidget.insertRow (int): слишком много аргументов . Пожалуйста, измените ответ .
def add_guest(self): rowPosition = self.tableWidget.rowCount() self.tableWidget.insertRow(rowPosition) guest_name = self.lineEdit.text() guest_email = self.lineEdit_2.text() numcols = self.tableWidget.columnCount() numrows = self.tableWidget.rowCount() self.tableWidget.setRowCount(numrows) self.tableWidget.setColumnCount(numcols) self.tableWidget.setItem(numrows -1,0,QtGui.QTableWidgetItem(guest_name)) self.tableWidget.setItem(numrows -1,1,QtGui.QTableWidgetItem(guest_email)) print "guest added"
Вот как я сделал это для своего приложения для организации событий