Как переместить несколько строк одновременно вверх или вниз в виджете списка PyQt?

#python #pyqt5 #qlistwidget #pyqt6

Вопрос:

Я использую следующий код для перемещения одного элемента вверх в виджете списка PyQt6

 def move_item_up_in_list_box(self):
    row = self.listWidget.currentRow()
    text = self.listWidget.currentItem().text()
    self.listWidget.insertItem(row-1, text)
    self.listWidget.takeItem(row 1)
    self.listWidget.setCurrentRow(row-1)
 

Но я не смог найти возможность получить позиции индекса при выборе нескольких строк, хотя
«self.ListWidget.SelectedItems ()» возвращает тексты в выбранных элементах, я не мог понять, как перемещать несколько строк вверх или вниз.

Комментарии:

1. selectedItems() не возвращает «сообщения». Он возвращает список выбранных элементов .

2. да, я просто повторил список и использовал .text() для вывода текста, как я могу получить позиции индекса выбранных элементов?

Ответ №1:

Просто пройдите по циклу selectedItems() и используйте row() , чтобы получить строку каждого из них.

     for item in self.listWidget.selectedItems():
        row = self.listWidget.row(item)
        # ...
 

Учтите, что модель выбора обычно сохраняет порядок, в котором были выбраны элементы, поэтому вы всегда должны переупорядочивать элементы перед их перемещением, и помните, что если вы перемещаете элементы вниз, они должны быть перемещены в обратном порядке.

     def move_items(self, down=False):
        items = []
        for item in self.listWidget.selectedItems():
            items.append((self.listWidget.row(item), item))
        items.sort(reverse=down)
        delta = 1 if down else -1
        for row, item in items:
            self.listWidget.takeItem(row)
            self.listWidget.insertItem(row   delta, item)
 

Комментарии:

1. Спасибо за точные детали, порядок выбора, сортировка, изменение списка для перемещения вниз-все это было блестяще продумано!

2. @JackZero Добро пожаловать! Помните, что если ответ решает вашу проблему, вы должны отметить его как принятый, нажав на серую галочку слева от него. (Кстати, я исправил неправильную ссылку на виджет списка, которую я забыл заменить w , self.listWidget когда вставлял код обратно)