QTableWidget 某一列插入Check列,走了弯路,大概的意思是在QTableCell中插入一个Layout,然后在layout中放入一个QCheckBox
ck = QCheckBox()
h = QHBoxLayout()
h.setAlignment(Qt.AlignCenter)
h.addWidget(ck)
w = QWidget()
w.setLayout(h)
self.tv.setItem(j,0,item)
初步实现显示Checkbox的效果,但留下许多后遗症,比如Checkbox的高度不对,第二点击Checkbox后不触发CellChanged事件,在网上查了很久,发现还有一个更简洁有效的方法:
def init_data_checkable(self):
for j in range(self.bst.nrows) :
item = QTableWidgetItem()
item.setFlags(Qt.ItemIsUserCheckable|Qt.ItemIsEnabled)
item.setCheckState(Qt.Unchecked)
item.setData(LastStateRole, item.checkState())
self.tv.setItem(j,0,item)
self.tv.cellChanged.connect(self.handleItemClicked)
def handleItemClicked(self,row,col):
# print item
item = self.tv.item(row, col)
lastState = item.data(LastStateRole)
currentState = item.checkState()
if currentState != lastState:
print("changed: ")
if currentState == QtCore.Qt.Checked:
print("checked")
else:
print("unchecked")
item.setData(LastStateRole, currentState)
如此,事件触发完毕
LastStateRole = QtCore.Qt.UserRole
LastStateRole 功能还不太了解,毕竟不影响使用