2012-02-12 64 views
4

我目前正在试图实现某种文件浏览器/“资源管理器”到一个程序中......我正在使用Python和PySide与Qt-window-toolkit连接。或多或少的this youtube-video显示我想要在最后的行为。然而,本教程使用C++作为编程语言,但我还没有能够从C++示例中推导出正确的Python代码。简单的文件浏览器/文件选择器在Python程序与Qt-GUI?

基本上,我的问题是获得显示在左列(树状文件夹视图)中单击的文件夹的内容的右列(文件视图)。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import sys 
from PySide import QtGui, QtCore 

class MainWindow(QtGui.QMainWindow): 
    def __init__(self): 
     QtGui.QMainWindow.__init__(self) 

     self.resize(600, 600) 
     self.fileBrowserWidget = QtGui.QWidget(self) 
     self.setCentralWidget(self.fileBrowserWidget) 

     self.dirmodel = QtGui.QFileSystemModel() 
     # Don't show files, just folders 
     self.dirmodel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.AllDirs) 
     self.folder_view = QtGui.QTreeView(parent=self); 
     self.folder_view.setModel(self.dirmodel) 
     self.folder_view.clicked[QtCore.QModelIndex].connect(self.clicked) 

     # Don't show columns for size, file type, and last modified 
     self.folder_view.setHeaderHidden(True) 
     self.folder_view.hideColumn(1) 
     self.folder_view.hideColumn(2) 
     self.folder_view.hideColumn(3) 

     self.selectionModel = self.folder_view.selectionModel() 
     self.filemodel = QtGui.QFileSystemModel() 
     # Don't show folders, just files 
     self.filemodel.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Files) 
     self.file_view = QtGui.QListView(parent=self); 
     self.file_view.setModel(self.filemodel) 

     splitter_filebrowser = QtGui.QSplitter() 
     splitter_filebrowser.addWidget(self.folder_view) 
     splitter_filebrowser.addWidget(self.file_view) 
     splitter_filebrowser.setStretchFactor(0,2) 
     splitter_filebrowser.setStretchFactor(1,4) 

     hbox = QtGui.QHBoxLayout(self.fileBrowserWidget) 
     hbox.addWidget(splitter_filebrowser) 

    def set_path(self): 
     self.dirmodel.setRootPath("") 

    def clicked(self, index): 
     # get selected path of folder_view 
     index = self.selectionModel.currentIndex() 
     dir_path = self.dirmodel.filePath(index) 
     ############################################### 
     # Here's my problem: How do I set the dir_path 
     # for the file_view widget/the filemodel? 
     ############################################### 
     self.filemodel.setRootPath(dir_path) 


app = QtGui.QApplication(sys.argv) 
main = MainWindow() 
main.show() 
main.set_path() 

sys.exit(app.exec_()) 

正如你可以在我的代码中看到的,我已经尝试过使用setRootPath -function ......然而,这似乎并没有被正确的。所以我想知道,为了实现这个目标我需要做些什么?

回答

4

您需要将根索引设置为文件模型中的相应索引。您可以通过添加下面一行到点击()函数的末尾这样做:

self.file_view.setRootIndex(self.filemodel.index(dir_path)) 

我能够从使用Qt在C++我的经验,看着办吧。如果你能弄清楚它是如何转化为Python的话,那么在C++中使用Qt的文档是非常好的。我能够通过查看QFileSystemModel documentation来了解这一点。

+0

谢谢!这对我很好:) “我能从我在C++中使用Qt的经验中找到它。” - 这就是我为我的代码中的大多数其他事情所做的方式......而且我也在这里尝试了这种方法,但我仍然没有弄清楚如何让它工作;) – mozzbozz 2012-02-13 13:46:09

2

您需要设置文件列表视图的根指数:

def clicked(self, index): 
    # the signal passes the index of the clicked item 
    dir_path = self.filemodel.filePath(index) 
    root_index = self.filemodel.setRootPath(dir_path) 
    self.file_view.setRootIndex(root_index) 
+1

也谢谢你为您的解决方案!它也工作得很好:)仅仅因为我必须在这两个答案中进行选择,几秒钟之后,我选择了其他(第一个)答案;)非常感谢您的帮助! – mozzbozz 2012-02-13 13:50:06