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

如何在QTableWidget中关联复选框与IdTeste,或隐藏Id且保留行内数据

解决方案

一、关联复选框与IdTeste

通过给QCheckBox设置自定义属性的方式,将对应行的IdTeste绑定到复选框上,这样在复选框状态变化时,可直接获取该行Id,用于后续数据库修改操作。

代码调整要点

  1. 创建复选框时,用setProperty存储当前行的IdTeste
  2. 修改handleCheckbox槽函数,获取绑定的Id并处理行移动逻辑

调整后的完整代码片段

def preenchetabel(self):
    # 补充数据库连接参数,比如dbname、user、password等
    con = psycopg2.connect(dbname="你的数据库名", user="用户名", password="密码", host="localhost")
    cursor = con.cursor()
    
    # 执行关联查询,直接获取所需数据
    cursor.execute("""SELECT       
                   "Teste"."IdTeste",
                   "Teste"."DataEntrada",
                   "Teste"."Código de Barras",
                   "Teste"."Numero de serie",
                   "Categorias"."NomeCategoria",
                   "Marcas"."NomeMarca",
                   "Teste"."Modelo",
                   "Fornecedores"."NomeFornecedor",
                   "Estado"."NomeEstado",
                   "Projetos"."NomeProjeto",
                   "Teste"."Valor/Uni",
                   "Teste"."Quantidade",
                   "Teste"."DataSaida"
                   FROM "Teste"
                   JOIN "Categorias" ON "Teste"."Categoria" = "Categorias"."IdCategoria"
                   JOIN "Marcas" ON "Teste"."Marcasss" = "Marcas"."IdMarca"
                   JOIN "Fornecedores" ON "Teste"."Fornecedores" = "Fornecedores"."IdFornecedor"
                   JOIN "Estado" ON "Teste"."Estado" = "Estado"."IdEstado"
                   JOIN "Projetos" ON "Teste"."Projeto" = "Projetos"."IdProjeto";""")
    dados = cursor.fetchall()
    num_rows9 = len(dados)
    num_columns9 = len(cursor.description)
    
    # 初始化下方表格
    self.tableProdutossaida.setRowCount(0)
    self.tableProdutossaida.setColumnCount(num_columns9 + 1)  # 额外添加复选框列
    
    # 设置表头
    self.tableProdutossaida.setHorizontalHeaderLabels([
        "CheckBox", "IdTeste", "Data de Entrada", "Código de barras", 
        "Número de Série", "Categoria", "Marca", "Descrição/Modelo", 
        "Fornecedor", "Estado", "Projeto", "Valor/uni", "Quantidade", "DataSaida"
    ])
    
    # 填充表格数据
    for row_idx, row_data in enumerate(dados):
        # 创建复选框并绑定IdTeste
        checkbox = QCheckBox()
        checkbox.setCheckState(Qt.Unchecked)
        checkbox.setProperty("id_teste", row_data[0])
        # 绑定状态变化信号,传递行索引和Id
        checkbox.stateChanged.connect(lambda state, r=row_idx, id=row_data[0]: self.handleCheckbox(state, r, id))
        self.tableProdutossaida.setCellWidget(row_idx, 0, checkbox)
        
        # 填充其他列数据
        for col_idx, cell_value in enumerate(row_data):
            item = QTableWidgetItem(str(cell_value))
            self.tableProdutossaida.setItem(row_idx, col_idx + 1, item)
    
    # 关闭数据库连接
    cursor.close()
    con.close()

def handleCheckbox(self, state, row_idx, id_teste):
    if state == Qt.Checked:
        # 获取当前行的所有数据
        row_data = []
        for col in range(1, self.tableProdutossaida.columnCount()):
            item = self.tableProdutossaida.item(row_idx, col)
            if item:
                row_data.append(item.text())
        
        # 插入到上方表格
        new_row = self.tableLinhaNova.rowCount()
        self.tableLinhaNova.insertRow(new_row)
        for col_idx, value in enumerate(row_data):
            self.tableLinhaNova.setItem(new_row, col_idx, QTableWidgetItem(value))
        
        # 将IdTeste绑定到上方表格的行,方便后续修改数据库
        self.tableLinhaNova.item(new_row, 0).setProperty("id_teste", id_teste)
        
        # 移除下方表格的已勾选行(可选)
        self.tableProdutossaida.removeRow(row_idx)

二、隐藏Id列但保留数据

如果不需要显示IdTeste列,可将其设置为隐藏,用户看不到但数据仍保存在表格中,需要时可直接取出。

实现方法

在填充完表格后,添加一行代码隐藏Id列:

# 隐藏IdTeste列(索引为1,第0列是复选框)
self.tableProdutossaida.setColumnHidden(1, True)

获取隐藏的Id值

当需要使用Id操作数据库时,直接通过行索引获取对应列的内容:

# 获取指定行的IdTeste
id_teste = self.tableProdutossaida.item(row_idx, 1).text()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 19:24:56