Quantcast
Channel: Preguntas activas con las etiquetas pyqt - Stack Overflow en español
Viewing all articles
Browse latest Browse all 79

Seleccionar un QCheckBox externo para marcar o desmarcar varios QCheckBox de un QTableWiget

$
0
0

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'

Viewing all articles
Browse latest Browse all 79

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>