0

I'm trying to add a checkbox in each row of a qtablewidget. When the table has more than one row, the checkbox is not inserted in the first row. Just in the last one. But the data coming from a db are inserted in every row. Can anyone please explain what I am doing wrong here.

checkbox = QtWidgets.QCheckBox()
income = helper.selectOne("""SELECT En_Kat.ID_En, En_Kat.ID_Kind, En_Kat.Entgelt_Kat, En_Kat.E_Start_Date  
    From En_Kat WHERE En_Kat.ID_Kind = ?""", (idc, ))
for rowi, i in enumerate(income):
    self.ui.incomeTWG.insertRow(rowi)
    self.ui.incomeTWG.setCellWidget(rowi,5,checkbox) 
    for coli, datai in enumerate(i):
        celli = QtWidgets.QTableWidgetItem(str(datai))
        self.ui.incomeTWG.setItem(rowi,coli,celli)
        celli.setTextAlignment(Qt.AlignHCenter)

Now with reproducable code:

import sys
from ui.mainwindow import Ui_MainWindow
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
app = QtWidgets.QApplication(sys.argv)

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
    super().__init__(parent)

    self.ui = Ui_MainWindow()
    self.ui.setupUi(self)

    checkbox = QtWidgets.QCheckBox()
    income = (('1', '2'),('3','4'))
    for rowi, i in enumerate(income):
        self.ui.tableWidget.insertRow(rowi)
        self.ui.tableWidget.setCellWidget(rowi,2,checkbox) 
        for coli, datai in enumerate(i):
            celli = QtWidgets.QTableWidgetItem(str(datai))
            self.ui.tableWidget.setItem(rowi,coli,celli)
            celli.setTextAlignment(Qt.AlignHCenter)

window = MainWindow()
window.show()
sys.exit(app.exec_())

and here is the ui:

efrom PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(230, 160, 351, 192))
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(3)
        self.tableWidget.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        self.tableWidget.setHorizontalHeaderItem(2, item)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    item = self.tableWidget.horizontalHeaderItem(0)
    item.setText(_translate("MainWindow", "a"))
    item = self.tableWidget.horizontalHeaderItem(1)
    item.setText(_translate("MainWindow", "b"))
    item = self.tableWidget.horizontalHeaderItem(2)
    item.setText(_translate("MainWindow", "c"))
MeNoSmart
  • 1
  • 2

1 Answers1

0

In your code you have only created a single QCheckBox, and what happens is that if you set a widget to a certain item and that widget was already in another widget then it will be moved, another widget will not be created as you expect. The solution is to create widgets inside the loop:

income = (("1", "2"), ("3", "4"))
for rowi, i in enumerate(income):
    checkbox = QtWidgets.QCheckBox()
    self.ui.tableWidget.insertRow(rowi)
    self.ui.tableWidget.setCellWidget(rowi, 2, checkbox)
    for coli, datai in enumerate(i):
        celli = QtWidgets.QTableWidgetItem(str(datai))
        self.ui.tableWidget.setItem(rowi, coli, celli)
        celli.setTextAlignment(Qt.AlignHCenter)
eyllanesc
  • 235,170
  • 19
  • 170
  • 241