Filtrar opciones del desplegable con QSqlRelationalTableModel
Hola a todos,
Estoy intentando hacer una tabla editable con QSqlRelationalTableModel.
El modelo está asociado a una tabla que tiene dos claves foraneas y un filtro para mostrar sólo los registros asociados a un id determinado. Esta hecho de la siguiente forma:
modelo = new QSqlRelationalTableModel(this);
modelo->setTable("sesionjuego_has_jugador");
modelo->setFilter("sesionjuego_idSesionjuego="+idsesionjuego);
modelo->setRelation(1, QSqlRelation("jugador", "aliasJugador", "aliasJugador"));
modelo->select();
ui.tablaView->setModel(modelo);
Al ejecutar, en la tableView se visualiza la tabla y en la celda de "aliasJugador" se crea un desplegable con todos los alias de la tabla foranea jugador.
Lo que necesito es filtrar esas opciones. Es decir, no quiero que me saque todos los alias, sino solo los alias que cumplan una condición determinada. He probado con:
modelo->setFilter("relTblAl_1.Equipo_nombre_equipo = 'Femenino'");
Pero lo que me hace es filtar la tabla del modelo y visualizar sólo los registros en los que el jugador es del equipo femenino. Yo necesito filtrar las opciones del desplegable, es decir, que solo muestre los alias de los jugadores del equipo femenino.
¿Alguien podría ayudarme? Muchas gracias!


Cambia el filtro o utiliza un modelo de filtrado
Puedes utilizar el método setFilter del modelo, pero ten en cuenta que lo que hace es comportarse como la parte WHERE de una sentencia SELECT de SQL. Por ejemplo, si para el modelo has utilizado
y vuelves a establecer otro filtro, te machaca el anterior. Deberías construir una nueva sentencia de filtrado que te incluya ambas opciones:
Que es como si lanzaras una sentencia select del tipo "SELECT * FROM Tabla WHERE atr1='valor' AND atr2='valor2'". Esto puede resultar un poco engorroso si en algún momento quieres cambiar el filtro, así que puedes utilizar también un QSortFilterProxyModel encima del modelo de tabla para realizar un filtrado más fino:
Básicamente, el modelo de filtro hace de intermediario entre el modelo real y la vista, proporcionando capacidades de filtrado sobre una columna concreta. Lo que hacemos con el filterKeyColumn es recuperar el índice del atributo que nos interesa de la tabla (tenemos que pasarle un número indicando la posición del atributo dentro del registro, por ejemplo para el primer valor de la tabla pasaríamos un '0', para el segundo un '1', y así...), pero si sabes cual es el índice del atributo, puedes saltarte la parte de modelo->record... y poner el número directamente.
Consulta la documentación de QSortFilterProxyModel para más información.
¡Un saludo!
Filtro a la tabla con la clave foranea
Muchas gracias, he intentado hacerlo de esta manera pero así el filtro se está aplicando al campo "Equipo_nombre_equipo" de la tabla asociada al modelo, en mi caso "sesionjuego_has_jugador". Mi tabla sesionjuego_has_jugador no tiene un campo Equipo_nombre_equipo, quien tiene ese campo es la tabla "jugador" (la tabla con la clave foránea y que he relacionado con la tabla del modelo mediante:
modelo->setTable("sesionentreno_has_jugador");
modelo->setRelation(1, QSqlRelation("jugador", "aliasJugador", "aliasJugador"));
Yo necesito filtrar las opciones que aparecen en el desplegable de la tableview y que se muestran a través de la clave foránea. Es decir, en vez de que el desplegable muestre todos los alias de los jugadores, yo necesito que muestre los alias de los jugadores cuando el equipo sea el femenino (pero el campo femenino está en la tabla jugador y no en la tabla sesionentreno_has_jugador.
Copio para más información los campos de las dos tablas relacionadas:
CREATE TABLE IF NOT EXISTS `BDJuego`.`jugador` (
`aliasJugador` VARCHAR(45) NOT NULL ,
`nombre_jugador` VARCHAR(45) NULL DEFAULT NULL ,
`Equipo_nombre_equipo` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`aliasJugador`) ,
UNIQUE INDEX `idJugador_UNIQUE` (`aliasJugador` ASC) ,
INDEX `fk_Jugador_Equipo1` (`Equipo_nombre_equipo` ASC) ,
CONSTRAINT `fk_Jugador_Equipo1`
FOREIGN KEY (`Equipo_nombre_equipo` )
REFERENCES `fkt`.`equipo` (`nombre_equipo` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
CREATE TABLE IF NOT EXISTS `BDJuego`.`sesionjuego_has_jugador` (
`sesionjuego_idSesionjuego` INT(11) NOT NULL DEFAULT 0 ,
`jugador_aliasJugador` VARCHAR(45) NOT NULL DEFAULT 0 ,
`estado_jugador` VARCHAR(45) NULL DEFAULT NULL ,
PRIMARY KEY (`sesionjuego_idSesionjuego`, `jugador_aliasJugador`) ,
INDEX `fk_sesionjuego_has_jugador_jugador1` (`jugador_aliasJugador` ASC) ,
INDEX `fk_sesionjuegoo_has_jugador_sesionjuego1` (`sesionjuego_idSesionjuego` ASC) ,
CONSTRAINT `fk_sesionejuego_has_jugador_sesionjuego1`
FOREIGN KEY (`sesionjuego_idSesionjuego` )
REFERENCES `fkt`.`sesionjuego` (`idSesionjuego` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_sesionjuego_has_jugador_jugador1`
FOREIGN KEY (`jugador_aliasJugador` )
REFERENCES `fkt`.`jugador` (`aliasJugador` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;
En tal caso...
... qué quieres que te diga, prueba con el QSortFilterProxyModel :D
¡Un saludo!