2

I need to going to some directory when user click on button.

User enter path in QInputDialog (for example /mnt/data/Music on linux), and program go to this directory, like M-c in Midnight Commander or cd in ranger, but i don't know how i can do this... I already know all the documentation by heart

main.py

import sys
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtWidgets import QMainWindow, QInputDialog
import exampleQTV

class PyMap(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.search.clicked.connect(self.searchAction)

    def searchAction(self):
        text, ok = QInputDialog.getText(self, "Go to", "Enter path")
        if ok:
            path = text.split("/")

        for item in path:
            if item != "":
                print("ITEM:", item)
                self.leftView.keyboardSearch(item)
                self.leftView.setExpanded(self.leftView.currentIndex(), True)
                print("currentIndex():",self.leftView.model.filePath(self.leftView.currentIndex()))
                child = self.leftView.currentIndex().child(0,0)
                print("child:", self.leftView.model.filePath(child))

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.leftView = exampleQTV.exampleQTV()
        self.leftView.setObjectName("leftView")
        self.gridLayout.addWidget(self.leftView, 1, 0, 1, 1)
        self.search = QtWidgets.QPushButton(self.centralwidget)
        self.search.setObjectName("select")
        self.gridLayout.addWidget(self.search, 0, 0, 1, 2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.search.setText(_translate("MainWindow", "Search"))


def main():
    app = QtWidgets.QApplication(sys.argv)
    window = PyMap()
    window.show()
    app.exec_()


if __name__ == '__main__':
    main()


exampleQTV.py

from PyQt5.QtWidgets import QTreeView, QFileSystemModel
from PyQt5.QtCore import QDir

class exampleQTV(QTreeView):
    def __init__(self):
        QTreeView.__init__(self)
        self.model = QFileSystemModel()
        self.model.setRootPath(QDir.rootPath())
        self.setModel(self.model)
        self.eventCalled = False
        self.requestForEscape = False

        self.setColumnHidden(1, True)
        self.setColumnHidden(2, True)
        self.setColumnHidden(3, True)
        self.expandAll()

eyllanesc
  • 235,170
  • 19
  • 170
  • 241
GENKY
  • 103
  • 8
  • Explain better, many do not know the SW that you mean, what does *go to this directory* mean ?, there are 2 QTreeView Do you have to see something with this question? if the QTreeViews are relevant then for example if "/mnt/data/Music" is placed which should be shown in the QTreeViews. – eyllanesc Jun 22 '19 at 07:06
  • @eyllanesc /mnt/data/Music is directory on my hard disk. You can delete one tree view. Other not need – GENKY Jun 22 '19 at 08:43
  • 1) Should not you erase it from the code you provide to avoid confusion? 2) You have not answered me yet: what does go to this directory mean ? – eyllanesc Jun 22 '19 at 08:44
  • @eyllanesc nothing. This directory need for user – GENKY Jun 22 '19 at 09:16
  • I do not understand you, I am not interested in the user, I am interested in explaining what you want to obtain because your question is unclear, you do not answer my questions, goodbye, I will follow my path. – eyllanesc Jun 22 '19 at 09:18
  • @eyllanesc ok, it's favourite list. When i click on some button like shortcut , program open directory in qtreeview – GENKY Jun 22 '19 at 09:37
  • From what I understand you want the path provided by the user, for example "/mnt/data/Music", to be the root of what is shown in the QTreeView. I am right? – eyllanesc Jun 22 '19 at 09:38
  • Use `self.leftView.setRootIndex(self.leftView.model.index(path))` – eyllanesc Jun 22 '19 at 09:42
  • @eyllanesc sorry for long time. Yes it's works, but i don't need change the root. I need just expand to the needed dir – GENKY Jun 22 '19 at 12:31
  • @eyllanesc no i don't need change the root. I repeait it. I don't need use setRootIndex\Path. I need to make a file manager. And root item always should be QDir.rootPath(), not other directory – GENKY Jun 23 '19 at 05:29
  • @eyllanesc wow, this is works... I don't seen this function in documentation... Thank you what you spended your time on me.. I'm sorry... – GENKY Jun 23 '19 at 11:07

1 Answers1

2

If you want an item to be expanded your ancestors must be expanded, in the following code you implement that logic:

import sys

from PyQt5 import QtCore, QtWidgets


def expandPath(index, view):
    if not index.isValid():
        return
    indexes = []
    ix = index
    while ix.isValid():
        indexes.insert(0, ix)
        ix = ix.parent()
    for ix in indexes:
        view.expand(ix)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)

    model = QtWidgets.QFileSystemModel()
    model.setRootPath(QtCore.QDir.rootPath())
    view = QtWidgets.QTreeView()

    view.setModel(model)
    view.setRootIndex(model.index(QtCore.QDir.rootPath()))
    doc_directory = QtCore.QStandardPaths.writableLocation(
        QtCore.QStandardPaths.DocumentsLocation
    )
    ix = model.index(doc_directory)
    expandPath(ix, view)
    view.resize(640, 480)
    for i in (1, 2, 3):
        view.setColumnHidden(i, True)
    view.show()
    sys.exit(app.exec_())
eyllanesc
  • 235,170
  • 19
  • 170
  • 241