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_())
Пожалуйста ВСЕГДА предоставляйте пример, который демонстрирует проблему !!!
