Как сделать узел PyQt5 QTreeview редактируемым в коде?

У меня вопрос.

Я использую PyQt5 и Python 3.6, и я хочу использовать QTreeview для перечисления файлов в папке. Когда пользователь щелкает правой кнопкой мыши файл в папке, у меня появляется контекстное меню. Один из вариантов - «Переименовать». Если пользователь щелкает по нему, я хочу, чтобы файл был выбран, а затем выделено имя файла, как это делает Windows, когда вы делаете это в проводнике.

Переименовать файл Windows

Я почти уверен, что понял, как я хочу подойти к самому меню и другим функциям (Удалить, Открыть и т. Д.) И я почти уверен, что смогу использовать слот / сигнал для захвата новое имя и измените его в файловой системе. Но я ПОЛНОСТЬЮ озадачен тем, как сделать этот выбор и выделить программно. Опять же, это будет сделано через функцию контекстного меню. Я потратил ЧАСЫ на поиск в Интернете и документации Qt, пытаясь понять это. Признаюсь, я сильно запутался в документации по этому поводу.

Я видел, где вы можете использовать currentIndex () QTreeview для получения объекта QModelIndex текущего выбранного элемента, но копаясь в документации QModelIndex, я не нашел ничего о редактировании или выделении элементов. Я знаю, что есть флаги. Я вижу их на примерах моделей. Я не понимаю, что вы должны с ними делать.

Поддерживает ли QTreeview эту функцию? Я также посмотрел на QTreewidget, но не похоже, что у него есть функции, которые мне нужны для отображения файлов в стиле файловой системы узлов.

Спасибо за любую помощь.


person Community    schedule 14.07.2018    source источник
comment
stackoverflow.com/questions/23305320/   -  person Maxwell77    schedule 14.07.2018
comment
stackoverflow.com/questions/ 48121711 /   -  person S. Nick    schedule 15.07.2018


Ответы (1)


Что вам нужно сделать, это следующее:

  • отключите свойство ReadOnly для QFileSystemModel.
  • Отключить триггеры QTreeView
  • Получите QModelIndex, связанный с позицией щелчка, используя indexAt()
  • Включите редактирование с помощью edit() метода QTreeView.

В примере я показываю, как включить контекстное меню в первом столбце.

from PyQt5 import QtCore, QtWidgets


class FileSystemView(QtWidgets.QTreeView):
    def __init__(self, parent=None):
        super(FileSystemView, self).__init__(parent)

        self.model = QtWidgets.QFileSystemModel()
        self.model.setRootPath(QtCore.QDir.homePath())
        self.setModel(self.model)
        self.setRootIndex(self.model.index(QtCore.QDir.homePath()))
        self.model.setReadOnly(False)
        self.setAnimated(False)
        self.setSortingEnabled(True)
        self.setEditTriggers(QtWidgets.QTreeView.NoEditTriggers)
        self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.customContextMenuRequested.connect(self.showContextMenu)


    def showContextMenu(self, point):
        ix = self.indexAt(point)
        if ix.column() == 0:
            menu = QtWidgets.QMenu()
            menu.addAction("Rename")
            action = menu.exec_(self.mapToGlobal(point))
            if action:
                if action.text() == "Rename":
                    self.edit(ix)


if __name__ == '__main__':
    import sys

    app =QtWidgets.QApplication(sys.argv)
    w = FileSystemView()
    w.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 15.07.2018
comment
ДА! Это ПОЛНОСТЬЮ работает! Большое спасибо. Я пытался проголосовать, но у меня нет репутации. Увы. Мне было ОЧЕНЬ ОЧЕНЬ трудно понять QTreeview, и я думал, что мне нужно создать здесь собственный виджет на основе QTreeview. Спасибо вам за то, что подтвердили это для меня. Я думаю, что это было огромным недостатком в моем понимании этого конкретного виджета. Я отделял модель от самого виджета. Этот подход очень интегрирован и интуитивно понятен мне как программисту. Теперь у меня есть довольно четкое представление о том, как я подойду к реализации как виджета, так и контекстного меню! - person ; 19.07.2018
comment
Я также хочу указать, что я не видел метода редактирования в QTreeview документация. Это могло позволить мне вообще избежать публикации вопроса. - person ; 19.07.2018
comment
Извините, забыл про галочку! Я не занимаюсь Stack часто, в основном, когда мы в какой-то степени отчаялись после нескольких часов или дней поисков. Обзор тура! Спасибо еще раз. - person ; 20.07.2018