如何在QTableWidget中关联复选框与IdTeste,或隐藏Id且保留行内数据
解决方案
一、关联复选框与IdTeste
通过给QCheckBox设置自定义属性的方式,将对应行的IdTeste绑定到复选框上,这样在复选框状态变化时,可直接获取该行Id,用于后续数据库修改操作。
代码调整要点
- 创建复选框时,用
setProperty存储当前行的IdTeste - 修改
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
相关产品推荐
相关产品推荐

