Как сделать выбранный элемент QListView видимым? - PullRequest
0 голосов
/ 30 мая 2018

Я новичок в Python.У меня есть форма Python с 2 PyQt5 Qlistviews (LV).Существует доступный и выбранный список.Я могу загрузить имеющееся LV и посмотреть его содержимое.Я могу проверить элемент, который нужно переместить в выбранный LV, нажать кнопку, и элемент переместится, но его текст не отображается в выбранном LV.

def Add_Button_click(self):
    # Add the available item to the selected box.
    self.sel_model = QStandardItemModel(self.Selected_List)
    # Loop through the available model finding items that have been checked.

    for index in range(self.avail_model.rowCount()):
        item = self.avail_model.item(index)
        # Add the item to the selected model
        if item.checkState() == QtCore.Qt.Checked:
            self.sel_model.appendRow(item)
    self.Selected_List.setModel(self.sel_model)

1 Ответ

0 голосов
/ 30 мая 2018

A QStandardItem не может принадлежать 2 моделям, поэтому, если вы хотите переместить его, вы должны сначала удалить его, используя takeRow(), а затем вставить его в новую модель.Непосредственное выполнение может привести к проблемам, поскольку удаляемая строка изменит rowCount(), лучше всего сделать наоборот.

import sys

from PyQt5 import QtWidgets, QtGui, QtCore

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        lay = QtWidgets.QHBoxLayout(self)
        avail_modelLV = QtWidgets.QListView()
        sel_modelLV = QtWidgets.QListView()
        button = QtWidgets.QPushButton("Select")
        lay.addWidget(avail_modelLV)
        lay.addWidget(button)
        lay.addWidget(sel_modelLV)

        button.clicked.connect(self.on_clicked)

        self.avail_model = QtGui.QStandardItemModel()
        self.sel_model = QtGui.QStandardItemModel()

        avail_modelLV.setModel(self.avail_model)
        sel_modelLV.setModel(self.sel_model)
        for text in ["text1", "text2", "text3", "text4"]:
            it = QtGui.QStandardItem(text)
            it.setCheckable(True)
            self.avail_model.appendRow(it)

    def on_clicked(self):
        self.sel_model.clear()
        for row in reversed(range(self.avail_model.rowCount())):
            it = self.avail_model.item(row)
            if it.checkState() == QtCore.Qt.Checked:
                it = self.avail_model.takeRow(row)
                self.sel_model.insertRow(0, it)

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