[Python] Widget costumizado de um (QListView) não dropa ao clicá-lo - PySide6

Discussão em 'Python' iniciado por Stack, Março 12, 2025.

  1. Stack

    Stack Membro Participativo

    Criei este widget de multi-seleção para o meu projeto. Contudo, eu não consigo fazer com que ele drope ao clicar em cima dele. Tentei criar um evento para isso e não obtive sucesso.

    from PySide6.QtWidgets import (
    QComboBox, QListView, QStyledItemDelegate, QStyleOptionButton, QStyle
    )
    from PySide6.QtCore import Qt, QAbstractListModel, QRect, QEvent, Slot


    class MultiSelectComboBox(QComboBox):
    def __init__(self):
    super().__init__()
    self.setView(QListView())
    self.view().setEditTriggers(QListView.NoEditTriggers)

    self.model = MultiSelectModel()
    self.setModel(self.model)
    self.view().setModel(self.model)
    self.view().setItemDelegate(CustomDelegate(self))

    self.view().viewport().installEventFilter(self)

    self.setEditable(True)
    self.lineEdit().setReadOnly(True)

    def handleItemPressed(self, index):
    if not index.isValid():
    return

    item = self.model.items[index.row()]
    item.checked = not item.checked
    self.model.dataChanged.emit(index, index)
    self.updateText()

    def updateText(self):
    self.checked_items = [
    item.text.split("|")[0].strip() for item in self.model.items if item.checked
    ]
    text = ", ".join(self.checked_items)
    self.lineEdit().setText(text)

    def eventFilter(self, obj, event):
    if obj == self.view().viewport() and event.type() == QEvent.MouseButtonRelease:
    index = self.view().indexAt(event.position().toPoint())
    if index.isValid():
    self.handleItemPressed(index)
    return True
    return super().eventFilter(obj, event)

    def get_indexs(self):
    indexs = []
    for i in range(self.model.rowCount()):
    index = self.model.index(i)
    if self.model.data(index, Qt.CheckStateRole) == Qt.Checked:
    indexs.append(i)
    return indexs

    def mousePressEvent(self, event):
    # Se o evento for um clique com o botão esquerdo
    if event.button() == Qt.LeftButton:
    # Verifique se o menu suspenso já está aberto
    if not self.view().isVisible():
    self.showPopup() # Isso abrirá o menu suspenso
    return
    super().mousePressEvent(event)

    Continue reading...

Compartilhe esta Página