Выберите все элементы в QListView и отмените выбор всех при изменении каталога - PullRequest
0 голосов
/ 03 декабря 2018

Я создал подобное окно Ссылка !и когда я выбираю каталог, я хотел бы выбрать все элементы в правом Qlist, а когда я переключаюсь на другой каталог, я отменял выбор элементов в предыдущем каталоге и выбирал все элементы в моем текущем каталоге.

Как я могу подойти к этому?

1 Ответ

0 голосов
/ 04 декабря 2018

Чтобы выбрать и отменить выбор всех элементов, вы должны использовать selectAll() и clearSelection() соответственно.Но выбор должен быть после обновления представления и для этого используется сигнал layoutChanged, также режим выбора должен быть установлен на QAbstractItemView::MultiSelection.

import sys
from PyQt5 import QtCore, QtWidgets

class Widget(QtWidgets.QWidget):
    def __init__(self, *args, **kwargs):
        super(Widget, self).__init__(*args, **kwargs)
        hlay = QtWidgets.QHBoxLayout(self)
        self.treeview = QtWidgets.QTreeView()
        self.listview = QtWidgets.QListView()
        hlay.addWidget(self.treeview)
        hlay.addWidget(self.listview)

        path = QtCore.QDir.rootPath()

        self.dirModel = QtWidgets.QFileSystemModel(self)
        self.dirModel.setRootPath(QtCore.QDir.rootPath())
        self.dirModel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllDirs)

        self.fileModel = QtWidgets.QFileSystemModel(self)
        self.fileModel.setFilter(QtCore.QDir.NoDotAndDotDot |  QtCore.QDir.Files)

        self.treeview.setModel(self.dirModel)
        self.listview.setModel(self.fileModel)

        self.treeview.setRootIndex(self.dirModel.index(path))
        self.listview.setRootIndex(self.fileModel.index(path))

        self.listview.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)

        self.treeview.clicked.connect(self.on_clicked)
        self.fileModel.layoutChanged.connect(self.on_layoutChanged)

    @QtCore.pyqtSlot(QtCore.QModelIndex)
    def on_clicked(self, index):
        self.listview.clearSelection()
        path = self.dirModel.fileInfo(index).absoluteFilePath()
        self.listview.setRootIndex(self.fileModel.setRootPath(path))

    @QtCore.pyqtSlot()
    def on_layoutChanged(self):
        self.listview.selectAll()

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