En PyQt6 cree una tabla (tab_pacientes
), la cual se carga correctamente. Además, tengo un checkbox externo a la tabla (chk_todos
), el cual utilizo para marcar o desmarcar todos los checkboxes contenidos en la primera columna de la misma. Ambos están contenidos en un Qdialog.
En el método marcar_todos
está la lógica para el marcado/desmarcado, pero no realiza nada. He intentado solucionarlo de varias formas, pero no encuentro la solución. Les agradecería por su apoyo.
Aquí comparto el código:
from datetime import datefrom PyQt6 import uicfrom PyQt6.QtCore import Qtfrom PyQt6.QtGui import QColor, QBrushfrom PyQt6.QtWidgets import QTableWidgetItem, QCheckBox, QDialog, QVBoxLayoutfrom Data.Psicologia_Data import PsicologoDataclass MovCarteraPsi(): def __init__(self): self.movcar = uic.loadUi('Gui/PsicologiaReev.ui') self.movcar.show() self.movcar.move(20,70) self.iniciaGUI() def iniciaGUI(self ): self.movcar.chk_todos.stateChanged.connect(self.marcar_todos) self.mostrar_psicologo() self.cargar_tabla() self.movcar.cbx_psipad.currentIndexChanged.connect(self.cargar_tabla) def mostrar_psicologo(self): psi_data = PsicologoData() psicologos = psi_data.obtener_psicologos() for psicologo in psicologos: self.movcar.cbx_psipad.addItem(psicologo[1]) def cargar_tabla(self): pacData = PsicologoData() psi_buscado = self.movcar.cbx_psipad.currentText() pacientes = pacData.obtener_pacreevaludos_por_psicologo(psi_buscado) cabeceras = ['Chk', 'Id', 'Cod_Pac', 'Pac', 'Fec_Inicio', 'Fec_Fin', 'ns', 'Direccion', 'Distrito', 'Usuario' ] self.movcar.tab_pacientes.clear() self.movcar.tab_pacientes.setColumnCount(len(cabeceras)) self.movcar.tab_pacientes.setHorizontalHeaderLabels(cabeceras) # Ajustar los anchos de las columnas ancho_columnas = [1, 65, 65, 250, 80, 80, 3, 250, 130, 100] for i, ancho in enumerate(ancho_columnas): self.movcar.tab_pacientes.setColumnWidth(i, ancho) # llenando la tabla con los datos y limpiando datos posiciones_deseadas = [0, 1, 5, 6, 7, 8, 10, 11, 14] self.movcar.tab_pacientes.setRowCount(0) for paciente in pacientes: ind = self.movcar.tab_pacientes.rowCount() self.movcar.tab_pacientes.insertRow(ind) chk = QCheckBox() # Crear instancia de QCheckBox chk.setChecked(False) # Opcional: desmarcar inicialmente el checkbox chk.setStyleSheet("margin-left:15%; margin-right:15%;") chk.stateChanged.connect(lambda state, row=ind: self.marcar_fila(state, row)) # Conectar la señal self.movcar.tab_pacientes.setCellWidget(ind, 0, chk) valores_deseados = [paciente[pos] for pos in posiciones_deseadas] for col, valor in enumerate(valores_deseados): if col == 3 or col == 4: if isinstance(valor, date): fecha_formateada = valor.strftime('%d-%m-%Y') item = QTableWidgetItem(fecha_formateada) else: item = QTableWidgetItem(str(valor)) else: item = QTableWidgetItem(str(valor)) self.movcar.tab_pacientes.setItem(ind, col + 1, item) # centra contenido de la col ID if col == 0 or col == 5: item.setTextAlignment(Qt.AlignmentFlag.AlignCenter) self.movcar.tab_pacientes.update() def marcar_fila(self, state, row): # print(f"Checkbox at row {row} changed to state {state}") match Qt.CheckState(state): case Qt.CheckState.Checked: color = QColor(Qt.GlobalColor.yellow) case Qt.CheckState.Unchecked: color = QColor(Qt.GlobalColor.white) for col in range(1, self.movcar.tab_pacientes.columnCount()): item = self.movcar.tab_pacientes.item(row, col) if item: item.setBackground(QBrush(color)) # print(f"Set color of row {row}, col {col} to {color.name()}") def marcar_todos(self, state): print(f"External checkbox changed to state {state}") for row in range(self.movcar.tab_pacientes.rowCount()): cell_widget = self.movcar.tab_pacientes.cellWidget(row, 0) if cell_widget: check_box = cell_widget.findChild(QCheckBox) if state == Qt.CheckState.Checked.value: check_box.setChecked(True) elif state == Qt.CheckState.Unchecked.value: check_box.setChecked(False)
En algunos casos sale este error:
check_box.setChecked(True) ^^^^^^^^^^^^^^^^^^^^AttributeError: 'NoneType' object has no attribute 'setChecked'