'Can't insert data into cell in qtablewidget
I want to setItem() in qtablewidget
when i try to edit any cell in qtablewidget
I tried many functions but I cant to solve them.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMainWindow
import sys
class Ui_MainWindow(QMainWindow):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(7)
self.tableWidget.setRowCount(15)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(6, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(7, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(8, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(9, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(10, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(11, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(12, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(13, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(14, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
self.gridLayout.addWidget(self.tableWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def test():
self.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem("test"))
self.tableWidget.itemChanged.connect(test)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(2)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(3)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(4)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(5)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(6)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(7)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(8)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(9)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(10)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(11)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(12)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(13)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(14)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "New Column"))
app = QtWidgets.QApplication(sys.argv)
Win = Ui_MainWindow()
ui = Ui_MainWindow()
ui.setupUi(Win)
Win.show()
sys.exit(app.exec_())
and I get this error:
Error in sys.excepthook:
Original exception was:Unhandled Python exception
Solution 1:[1]
You have 2 problems:
Do not modify the classes generated by pyuic, they are a practical word. So for my solution you have to restore the .py by running:
python -m pyuic5 your_ui.ui -o mainwindow_ui.py -x.The problem is that you are creating an infinite recursion. Say you start editing the item so the itemChanged signal will be emitted, when you add the new item itemChanged will also be emitted and this will insert another item which will cause itemChanged to be emitted, and so on ad infinitum causing your program to break. The solution is to prevent the signal from being emitted by inserting the item through
blockSignalsmethod.
import sys
from PyQt5 import QtWidgets
from mainwindow_ui import Ui_MainWindow
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.tableWidget.itemChanged.connect(self.handle_item_changed)
def handle_item_changed(self):
self.ui.tableWidget.blockSignals(True)
self.ui.tableWidget.setItem(0, 0, QtWidgets.QTableWidgetItem("test"))
self.ui.tableWidget.blockSignals(False)
app = QtWidgets.QApplication(sys.argv)
win = MainWindow()
win.show()
sys.exit(app.exec_())
Solution 2:[2]
I solve it, you should make the cell not Null you should give the cell a value like an empty string
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | eyllanesc |
| Solution 2 | Ahmed Salama |
