Qlistwiget получить индекс элемента по элементу

PyQt5 Мне нужно получить индекс элемента из QListWidgetItem по самому элементу (QListWidgetItem).

Нашел метод, но не понял его: indexFromItem(item)


Ответы (1 шт):

Автор решения: S. Nick

QModelIndex QListWidget::indexFromItem(const QListWidgetItem *item) const

Возвращает QModelIndex, связанный с данным элементом.

Т.к. вы не предоставили свой пример, приведу свой пример, который демонстрирует работу indexFromItem(item)

from PyQt5.QtCore import QSize, pyqtSignal
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QLineEdit, QPushButton,\
    QListWidgetItem, QVBoxLayout, QListWidget, QApplication


class ItemWidget(QWidget):
    itemDeleted = pyqtSignal(QListWidgetItem)

    def __init__(self, text, item, *args, **kwargs):
        super(ItemWidget, self).__init__(*args, **kwargs)
        
        self._item = item                       # Сохраните ссылку на объект элемента списка
        layout = QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(QLineEdit(text, self))
        layout.addWidget(QPushButton('x', self, clicked=self.doDeleteItem))

    def doDeleteItem(self):
        self.itemDeleted.emit(self._item)

    def sizeHint(self):
        return QSize(200, 40)


class Window(QWidget):
    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        layout = QVBoxLayout(self)

        self.listWidget = QListWidget(self)
        layout.addWidget(self.listWidget)

        # Кнопка очистки
        self.clearBtn = QPushButton('Очистить все элементы', self, clicked=self.doClearItem)
        layout.addWidget(self.clearBtn)

        # Добавить данные
        self.testData()

    def doDeleteItem(self, item):
        # Получить строку, соответствующую ему по элементу
        row = self.listWidget.indexFromItem(item).row()              #   !!!
        # Удалить item
        item = self.listWidget.takeItem(row)
        # Удалить виджет
        self.listWidget.removeItemWidget(item)
        del item

    def doClearItem(self):
        # Очистить все элементы
        for _ in range(self.listWidget.count()):
            # Удалить item
            item = self.listWidget.takeItem(0)
            # Удалить виджет
            self.listWidget.removeItemWidget(item)
            del item

    def testData(self):
        # Создать данные
        for i in range(20):
            item = QListWidgetItem(self.listWidget)
            widget = ItemWidget('item: {}'.format(i), item, self.listWidget)
            # Сигнал удаления привязки
            widget.itemDeleted.connect(self.doDeleteItem)
            self.listWidget.setItemWidget(item, widget)


if __name__ == '__main__':
    import sys
    
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

Пожалуйста ВСЕГДА предоставляйте пример, который демонстрирует проблему !!!

→ Ссылка