es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

QListWidget no muestra la fila seleccionada.

Hice una lista en mi programa y una función para reordenar (hacia arriba/abajo) las filas. Utilizo setCurrentRow() para cambiar la fila seleccionada después de moverla, funciona bien pero la selección no se muestra en la lista.

¿Cómo puedo hacer eso?

PS: Intenté setSelectionRectVisible(True) pero no sucede nada.

import sys
from PyQt5.QtWidgets import *

class MainWindow(QWidget):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__()

        self.my_list = QListWidget(self)
        self.my_list.setGeometry(5, 5, 90, 100)
        QListWidgetItem("1", self.my_list)
        QListWidgetItem("2", self.my_list)
        QListWidgetItem("3", self.my_list)
        QListWidgetItem("4", self.my_list)

        self.upButton = QPushButton("Arriba", self)
        self.upButton.move(100, 10)
        self.upButton.clicked.connect(self.up)
        self.downButton = QPushButton("Abajo", self)
        self.downButton.move(100, 30)
        self.downButton.clicked.connect(self.down)

    def up(self, event):
        w = self.my_list.currentRow()
        if w > 0:
            self.my_list.insertItem(w-1, self.my_list.currentItem().text())
            self.my_list.takeItem(w+1)
            self.my_list.setCurrentRow(w-1)
            # self.my_list.setSelectionRectVisible(True)

    def down(self, event):
        w = self.my_list.currentRow()
        if w < self.my_list.count()-1:
            self.my_list.insertItem(w+2, self.my_list.currentItem().text())
            self.my_list.takeItem(w)
            self.my_list.setCurrentRow(w+1)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    root = MainWindow()
    root.show()
    sys.exit(app.exec_())

Estaba creando este ejemplo simple para mostrarlo y funciona bien con el fondo predeterminado (gris).

Entonces mi problema es encontrar el nombre de la propiedad resaltada para establecerla.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para mostrar la selección en la lista, puedes utilizar el método setItemSelected() de la clase QListWidget para seleccionar y resaltar la fila después de reordenar. Así es como puedes modificar tu código para mostrar la selección:

    def up(self, event):
        w = self.my_list.currentRow() 
        if w > 0:
            item = self.my_list.takeItem(w)
            self.my_list.insertItem(w-1, item)
            self.my_list.setCurrentRow(w-1)
            self.my_list.setItemSelected(item, True)
    
    def down(self, event):
        w = self.my_list.currentRow() 
        if w < self.my_list.count()-1:
            item = self.my_list.takeItem(w)
            self.my_list.insertItem(w+1, item)
            self.my_list.setCurrentRow(w+1)
            self.my_list.setItemSelected(item, True)
    

    Ten en cuenta que también he modificado el código para tomar el elemento actual de la lista e insertarlo en la nueva posición, en lugar de simplemente insertar un nuevo elemento con el mismo texto. Esto garantiza que se conserven cualquier propiedad adicional del elemento (como icono o color de fondo) después de reordenar.

Comments are closed.