2013-11-15 37 views
0

我有一個QTreeViewQFileSystemModel它被QSortFilterProxyModel過濾。現在我想讓所有在QTreeView以上的文件夾位於普通文件/鏈接之上,就像Nautilus和Dolphin默認的那樣。代理目前僅按字母順序排序。我相信我必須創建一個Qt.UserRoleQt.ItemDataRole),但我不知道如何做到這一點。如何使用QSortFilterProxyModel對文件上方的文件夾進行排序?

import sys 
import os 

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 

     layout = QVBoxLayout() 
     self.setLayout(layout) 
     self._view = QTreeView() 
     self._view.setRootIsDecorated(False) 
     self._view.setAlternatingRowColors(True) 
     self._view.setEditTriggers(QAbstractItemView.NoEditTriggers) 
     self._view.setItemsExpandable(False) 
     self._view.setDragEnabled(False) 

     self._view.header().setClickable(True) 
     self._view.header().setMovable(False) 
     self._view.header().setSortIndicatorShown(True) 

     layout.addWidget(self._view) 

     # Add the model 
     self._model = QFileSystemModel() 
     self._model.setRootPath(QDir().rootPath()) 
     self._model.setReadOnly(False) 
     self._model.setFilter(QDir.AllDirs | QDir.AllEntries) 

     # Add sort proxy 
     self._proxy = QSortFilterProxyModel(self) 
     self._proxy.setSourceModel(self._model) 
     self._view.setModel(self._proxy) 

     # sorting 
     self._view.header().setSortIndicator(0, Qt.AscendingOrder) 
     self._proxy.sort(self._view.header().sortIndicatorSection(), 
         self._view.header().sortIndicatorOrder()) 
     QObject.connect(self._view.header(), 
         SIGNAL('sortIndicatorChanged(int,Qt::SortOrder)'), 
         self._proxy.sort) 

     # Root path 
     path = os.path.dirname(os.path.abspath(__file__)) 
     self._model.setRootPath(path) 

     # Set a root index 
     source_index = self._model.index(path) 
     index = self._proxy.mapFromSource(source_index) 
     self._view.setRootIndex(index) 

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

    widget = Widget() 
    widget.show() 

    sys.exit(app.exec_()) 
+0

將sort鍵設置爲'lambda x:(not os.path.isdir(x),x)' –

+0

今天看起來我是盲目的。你能指點我在哪裏找到那個排序鍵嗎? – Germar

回答

0

解決方案很容易!只需使用源代碼模式進行排序而不是代理

 # sorting 
     self._view.header().setSortIndicator(0, Qt.AscendingOrder) 
     self._model.sort(self._view.header().sortIndicatorSection(), 
         self._view.header().sortIndicatorOrder()) 
     QObject.connect(self._view.header(), 
         SIGNAL('sortIndicatorChanged(int,Qt::SortOrder)'), 
         self._model.sort) 

順便說一句問題是missleading。我只用QSortFilterProxyModel來過濾沒有排序。

1

自定義排序行爲是通過繼承QSortFilterProxyModel和重新實現lessThan()

從文檔

實現...

class MySortFilter(QSortFilterProxyModel): 
    def lessThan(self,left,right): 
     leftData = self.sourceModel().data(left) 
     rightData = self.sourceModel().data(right) 
     leftPath = os.path.abspath(str(leftData.toUrl().toLocalFile())) 
     rightPath = os.path.abspath(str(rightData.toUrl().toLocalFile())) 
     return (not os.path.isdir(leftPath),leftPath)< (not os.path.isdir(rightPath),rightPath) 

#now use this class instead of QSortFilterProxyModel 

我認爲會從閱讀文檔工作...我不是很familliar與QT雖然所以這就是我從文檔中得到的

+0

謝謝喬蘭。但是我得到了'TypeError:強制轉換爲Unicode:需要字符串或緩衝區,QVariant在isdir中找到了'。 – Germar

+0

是啊我不知道如何得到實際的價值...就像我說的不太熟悉QT leftData和rightData都應該是文件路徑 –

+1

再次感謝百萬,喬蘭。我終於找到了工作(請參閱我的編輯答案)。路徑並不漂亮,但它會工作。 – Germar

相關問題