You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取QTableWidget中ComboBox的更新后值?

解决QTableWidget中ComboBox修改后值的获取问题

你当前的问题在于使用currentCellChanged信号只能捕获单元格选中时的ComboBox初始值,无法监听ComboBox自身的内容变更。要获取修改后的新值,需要为每个ComboBox绑定其自身的currentTextChanged(或currentIndexChanged)信号。

修改步骤:

  1. 在创建ComboBox时,为其绑定内容变更信号,并传递对应的行号(方便定位是哪一行的ComboBox发生了变化)
  2. 新增处理ComboBox变更的函数,接收行号和新值

修改后的完整代码:

self.tblLayers = QtWidgets.QTableWidget(len(layerManager.getChars()), 4)
self.fillTable()
self.tblLayers.resizeColumnsToContents()
self.tblLayers.resizeRowsToContents()
self.tblLayers.verticalHeader().setVisible(False)
self.tblLayers.horizontalHeader().setVisible(True)
self.tblLayers.setHorizontalHeaderLabels(['Character','CTRL','GEO','T/R/ '])

self.tblLayers.cellChanged.connect(self.onCellChanged)# 获取复选框的值

def fillTable(self):
    for row in range(len(layerManager.getChars())):
        for col in range(4):
            chkLayer = QtWidgets.QTableWidgetItem()
            chkLayer.setCheckState(QtCore.Qt.CheckState.Checked)
            if col == 0:
                self.tblLayers.setItem(row, col, 
                QtWidgets.QTableWidgetItem(layerManager.getChars()[row]))
            elif col == 1:
                self.tblLayers.setItem(row, col, chkLayer)
            elif col == 2:
                self.tblLayers.setItem(row, col, chkLayer)
            elif col == 3:
                cmbTRoptions = QtWidgets.QComboBox()
                cmbTRoptions.addItems(['T', 'R', ' '])
                # 为ComboBox绑定内容变更信号,传递行号和新文本
                cmbTRoptions.currentTextChanged.connect(lambda text, r=row: self.onComboChanged(r, text))
                self.tblLayers.setCellWidget(row, col, cmbTRoptions)

def onCellChanged(self, row, column):
    # 保留原有的复选框处理逻辑
    item = self.tblLayers.item(row, column)
    if item and (column in [1,2]):
        print(f"行{row}列{column}的复选框状态: {item.checkState()}")

def onComboChanged(self, row, new_text):
    # 处理ComboBox的新值
    print(f"行{row}的ComboBox修改为: {new_text}")

关键说明:

  • 移除了原有的currentCellChanged绑定,因为它无法满足实时监听ComboBox内容变化的需求
  • 使用lambda传递行号时,必须把r=row作为参数,确保每个ComboBox绑定的是当前循环的行号(避免闭包陷阱)
  • currentTextChanged信号会在ComboBox内容修改时立即触发,能实时获取最新值

内容的提问来源于stack exchange,提问作者Brian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 16:40:02