I'm trying to display files and folders like column view in Mac finder. See Image. Screen Shot 2017-02-07 at 6.00.16 pm.png
I was able get the basic structure with the help of ListViews and QFileSystemModel. Then when I set the splitter handle as a corner widget for the scroll area, I encounter two issues here
  • When I resize the listview, the splitter handle disappears.
  • Even after setting the splitter handle width to 0, I see spacing between listviews.

Please refer the code below
Qt Code:
  1. # -*- coding: utf-8 -*-
  2.  
  3. from PyQt4 import QtCore, QtGui
  4. import os
  5.  
  6. try:
  7. _fromUtf8 = QtCore.QString.fromUtf8
  8. except AttributeError:
  9. def _fromUtf8(s):
  10. return s
  11.  
  12. try:
  13. _encoding = QtGui.QApplication.UnicodeUTF8
  14. def _translate(context, text, disambig):
  15. return QtGui.QApplication.translate(context, text, disambig, _encoding)
  16. except AttributeError:
  17. def _translate(context, text, disambig):
  18. return QtGui.QApplication.translate(context, text, disambig)
  19.  
  20. class PopulateList(QtGui.QDialog):
  21. def __init__(self,parent=None):
  22. super().__init__(parent)
  23. self.ui = Ui_Form()
  24. self.ui.setupUi(self)
  25. self.setModel()
  26. self.show()
  27.  
  28. self.ui.splitter.setHandleWidth(0)#not working
  29. self.ui.listView.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
  30. self.ui.listView.setCornerWidget(self.getCornerWidget(self.ui.splitter))
  31.  
  32. self.ui.closePushButton.clicked.connect(self.close)
  33. self.ui.listView.clicked.connect(self.showSubFiles)
  34.  
  35. def getCornerWidget(self, splitter):
  36. self.handle=splitter.handle(1)
  37. layout=QtGui.QHBoxLayout(self.handle)
  38. layout.setSpacing(0)
  39. layout.setMargin(0)
  40.  
  41. for i in range(0,2):
  42. line = QtGui.QFrame(self.handle)
  43. line.setFrameShape(QtGui.QFrame.VLine)
  44. layout.addWidget(line)
  45.  
  46. return self.handle
  47.  
  48. def showSubFiles(self, index):
  49. root_path = self.model.fileInfo(index).absoluteFilePath()
  50. self.model1=QtGui.QFileSystemModel()
  51. self.model1.setRootPath(root_path)
  52. self.ui.listView_1.setModel(self.model1)
  53. self.ui.listView_1.setRootIndex(self.model1.index(root_path))
  54.  
  55. def setModel(self):
  56. root_path=os.path.expanduser("~")
  57. self.model=QtGui.QFileSystemModel()
  58. self.model.setRootPath(root_path)
  59. self.model.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Dirs)
  60. self.ui.listView.setModel(self.model)
  61. self.ui.listView.setRootIndex(self.model.index(root_path))
  62.  
  63. class Ui_Form(object):
  64. def setupUi(self, Form):
  65. Form.setObjectName(_fromUtf8("Form"))
  66. Form.resize(602, 365)
  67. self.verticalLayout = QtGui.QVBoxLayout(Form)
  68. self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
  69. self.splitter = QtGui.QSplitter(Form)
  70. self.splitter.setOrientation(QtCore.Qt.Horizontal)
  71. self.splitter.setObjectName(_fromUtf8("splitter"))
  72. self.listView = QtGui.QListView(self.splitter)
  73. self.listView.setObjectName(_fromUtf8("listView"))
  74. self.listView_1 = QtGui.QListView(self.splitter)
  75. self.listView_1.setObjectName(_fromUtf8("listView_1"))
  76. self.verticalLayout.addWidget(self.splitter)
  77. self.horizontalLayout = QtGui.QHBoxLayout()
  78. self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
  79. spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
  80. self.horizontalLayout.addItem(spacerItem)
  81. self.closePushButton = QtGui.QPushButton(Form)
  82. self.closePushButton.setObjectName(_fromUtf8("closePushButton"))
  83. self.horizontalLayout.addWidget(self.closePushButton)
  84. self.verticalLayout.addLayout(self.horizontalLayout)
  85. self.verticalLayout.setStretch(0, 1)
  86.  
  87. self.retranslateUi(Form)
  88. QtCore.QMetaObject.connectSlotsByName(Form)
  89.  
  90. def retranslateUi(self, Form):
  91. Form.setWindowTitle(_translate("Form", "Form", None))
  92. self.closePushButton.setText(_translate("Form", "Close", None))
  93.  
  94.  
  95. if __name__ == "__main__":
  96. import sys
  97. app = QtGui.QApplication(sys.argv)
  98. listView=PopulateList()
  99. sys.exit(app.exec_())
To copy to clipboard, switch view to plain text mode