2017-02-24 10 views
0

QColumnViewの先頭に複数の列をロードする方法はありますか?QColumnViewの先頭に2列をロード

ツリービューで目的のインデックスのクリックをシミュレートしようとしました。 clickイベントは受信されますが、2番目の列はロードされません。インデックスとともにcreateColumnを呼び出そうとしました。しかし、両方のアプローチはうまくいきませんでした。

from PyQt4 import QtCore, QtGui 
import os 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class MyModel(QtGui.QFileSystemModel): 
    def __init__(self): 
     super().__init__() 
     self.checkedIndexes = {} 
     self.parentChecked=False 

    def flags(self,index): 
     flags=super().flags(index)|QtCore.Qt.ItemIsUserCheckable 
     return flags 

    def checkState(self, index): 
     if index in self.checkedIndexes: 
      return self.checkedIndexes[index] 
     else: 
      return QtCore.Qt.Checked 

    def data(self, index, role=QtCore.Qt.DisplayRole): 
     if role == QtCore.Qt.CheckStateRole: 
      if index.column() == 0: 
       return self.checkState(index) 
     else: 
      return super().data(index, role) 

    def setData(self, index, value, role): 
     if (role == QtCore.Qt.CheckStateRole and index.column() == 0): 
      self.checkedIndexes[index] = value 
      self.dataChanged.emit(index,index) 
      return True 

     return super().setData(index, value, role) 

    def hasChildren(self,index): 
     hasChildren=super().hasChildren(index) 
     path=super().filePath(index) 

     dirIter=QtCore.QDirIterator(path,QtCore.QDir.AllDirs|QtCore.QDir.NoDotAndDotDot|QtCore.QDir.NoSymLinks) 
     if dirIter.hasNext(): 
      return True 
     else: 
      return False 

     return hasChildren 

class columnView(QtGui.QDialog): 
    def __init__(self,parent=None): 
     super().__init__(parent) 
     self.ui = Ui_Dialog() 
     self.ui.setupUi(self) 

     self.model=MyModel() 
     self.model.setFilter(QtCore.QDir.AllDirs|QtCore.QDir.NoDotAndDotDot|QtCore.QDir.NoSymLinks) 
     path=os.path.expanduser("~") 
     self.model.setRootPath(path) 
     self.ui.columnView.setModel(self.model) 
     #print("path=",path) 
     self.ui.columnView.setRootIndex(self.model.index(path)) 

     self.ui.columnView.updatePreviewWidget.connect(self.closePreview) 

     self.show() 
     openIndex=self.model.index(os.path.join(path,"Documents")) 
     self.ui.columnView.createColumn(openIndex) 
     #QtCore.QMetaObject.invokeMethod(self.ui.columnView, "clicked", QtCore.Qt.QueuedConnection, QtCore.Q_ARG(QtCore.QModelIndex, openIndex)) 
     self.ui.columnView.clicked.connect(self.rowClicked) 
     self.ui.closePushButton.clicked.connect(self.close) 

    def rowClicked(self,index): 
     print("row clicked=",self.model.filePath(index)) 

    def closePreview(self,index): 
     self.ui.columnView.setPreviewWidget(None) 

class Ui_Dialog(object): 
    def setupUi(self, Dialog): 
     Dialog.setObjectName(_fromUtf8("Dialog")) 
     Dialog.resize(596, 389) 
     self.verticalLayout = QtGui.QVBoxLayout(Dialog) 
     self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 
     self.columnView = QtGui.QColumnView(Dialog) 
     self.columnView.setObjectName(_fromUtf8("columnView")) 
     self.verticalLayout.addWidget(self.columnView) 
     self.horizontalLayout = QtGui.QHBoxLayout() 
     self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) 
     spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) 
     self.horizontalLayout.addItem(spacerItem) 
     self.closePushButton = QtGui.QPushButton(Dialog) 
     self.closePushButton.setObjectName(_fromUtf8("closePushButton")) 
     self.horizontalLayout.addWidget(self.closePushButton) 
     self.verticalLayout.addLayout(self.horizontalLayout) 

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

    def retranslateUi(self, Dialog): 
     Dialog.setWindowTitle(_translate("Dialog", "Dialog", None)) 
     self.closePushButton.setText(_translate("Dialog", "Close", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    view = columnView() 
    sys.exit(app.exec_()) 

TreeViewコントロールとColumnView両方が階層データを表示するように設計されているが、私は、TreeViewコントロールと比較して、ColumnView実装はあまり意義と非常にイライラを与えられたと感じています。 TreeViewでは、上記のことをQTreeView.expand(index)で簡単に行うことができます。

答えて

関連する問題