我正在尝试在 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"))
答案 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)