在qtablewidget的每一行添加qcheckbox

时间:2021-01-23 14:48:26

标签: python pyqt qtablewidget qcheckbox

我正在尝试在 qtablewidget 的每一行中添加一个复选框。当表格有多于一行时,复选框不会插入第一行。就在最后一个。但是来自数据库的数据被插入到每一行中。谁能解释一下我在这里做错了什么。

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)

现在有了可重现的代码:

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_())

这是用户界面:

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"))

1 个答案:

答案 0 :(得分:0)

在您的代码中,您只创建了一个 QCheckBox,如果您将一个小部件设置为某个项目,并且该小部件已经在另一个小部件中,那么它将被移动,另一个小部件将不会像您一样创建预计。解决方案是在循环内创建小部件:

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)