2016-09-01 10 views
0

私は、指定されたパスのテキストとPythonのスクリプトファイルをリストするこの小さなUIを持っていますが、新しい項目を使ってリストを更新または置換しようとすると、データはそこに置かれますが空白に見えます。私はそれは、データが更新され、UIが再描画されなければならないということをUIに伝えないことと関係があると思いますか?ここでqTreewidgetをアップデート/リフレッシュする方法は?

が私のコードです:

import os 
import platform 
import shutil 
import subprocess 
import sys 
import time 

from PyQt4 import QtCore, QtGui 

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 Window(QtGui.QWidget): 
    def __init__(self): 
     super(Window, self).__init__() 

     self.fileListerObject = fileListGenerator(self) 

     self.setObjectName(_fromUtf8("Form")) 
     self.resize(350, 300) 

     mainSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) 
     mainSizePolicy.setHorizontalStretch(0) 
     mainSizePolicy.setVerticalStretch(0) 
     mainSizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth()) 

     self.setSizePolicy(mainSizePolicy) 
     self.setSizePolicy(mainSizePolicy) 

     self.uiName = 'Tree test' 
     self.setWindowTitle(self.uiName) 

     self.windowElements() 

    def windowElements(self):  
     verticalLayout = QtGui.QVBoxLayout(self) 
     verticalLayout.setObjectName(_fromUtf8("verticalLayout")) 

     self.inputLineEdit = QtGui.QLineEdit(self) 
     verticalLayout.addWidget(self.inputLineEdit) 

     buttonThing = QtGui.QPushButton(self) 
     buttonThing.setText('SET') 
     verticalLayout.addWidget(buttonThing) 
     self.connect(buttonThing, QtCore.SIGNAL("clicked()"), self.fileListerObject.fileLister) 

     self.treeWidget = QtGui.QTreeWidget(self) 
     self.treeWidget.setIndentation(5) 
     self.treeWidget.setAllColumnsShowFocus(True) 
     self.treeWidget.setObjectName(_fromUtf8("treeWidget")) 

     self.treeWidget.header().setSortIndicatorShown(True) 
     self.treeWidget.header().setSortIndicator(0, QtCore.Qt.AscendingOrder) 

     self.treeWidget.setSortingEnabled(True) 
     self.treeWidget.headerItem().setText(0, "file name") 
     self.treeWidget.headerItem().setText(1, "date") 
     self.treeWidget.headerItem().setText(2, "type") 
     self.__sortingEnabled = self.treeWidget.isSortingEnabled() 
     self.treeWidget.setSortingEnabled(False) 

     verticalLayout.addWidget(self.treeWidget) 

     buttonLaunchApp = QtGui.QPushButton(self) 
     buttonLaunchApp.setText('OPEN') 
     verticalLayout.addWidget(buttonLaunchApp) 

     self.show() 

class fileListGenerator(): 
    def __init__(self, parentWindow): 
     self.parentWindow = parentWindow 

    def fileLister(self): 
     directoryPath = self.parentWindow.inputLineEdit.text() 

     dirPath = directoryPath 
     fileList = os.listdir(dirPath) 
     projectFileList = [] 
     if len(fileList) != 0: 
      for file in fileList: 
       if (file.endswith('.txt') != False) or (file.endswith('.py') != False): 
        projectFileList.append(file) 
     print projectFileList 

     itemID = 0 
     for item in projectFileList: 
      filePath = dirPath + '\\' + item 
      threePartSplit = item.rpartition(".") 
      extension = threePartSplit[2] 
      dateTimeStamp = time.ctime(os.path.getmtime(filePath)) 
      QDate = QtCore.QDateTime.fromString (str(dateTimeStamp), 'ddd MMM dd HH:mm:ss yyyy') 
      QtGui.QTreeWidgetItem(self.parentWindow.treeWidget) 
      self.parentWindow.treeWidget.topLevelItem(itemID).setText(0, item) 
      self.parentWindow.treeWidget.topLevelItem(itemID).setData(1, QtCore.Qt.DisplayRole, QDate.toString('yyyy-MM-dd HH:mm:ss')) 
      self.parentWindow.treeWidget.topLevelItem(itemID).setText(2, extension) 
      itemID += 1 

     self.parentWindow.treeWidget.setSortingEnabled(self.parentWindow._Window__sortingEnabled) 

def run(): 
    app = QtGui.QApplication(sys.argv) 
    GUI = Window() 
    sys.exit(app.exec_()) 

run() 

私はこれを見てみました、私はQAbstractItemモデルを使用しての答えを思い付きましたか?しかし、私が理解していることから、あなたはqTreeVIEWでそれらを使うことができ、私はウィジェットのバージョンを使用しています。私はアイテムのデータをあまり使っていないので、qTreeviewが必要ではないと思うので、ウィジェットとして保存したいと思います。この設定でUIにデータを正しく更新させる方法はありますか?それとも、これを完全に再フォーマットする必要がありますか?

ありがとうございます。

答えて

0

正直、私はあなたのコードを取得していません。あなたはQTreeWidgetに新しいアイテムを追加したい場合はしかし、ここであなたがそれを行う方法は次のとおりです。

item = QTreeWidgetItem() 
item.setText(0, "John") # first name 
item.setText(1, "Doe") # last name 
item.setText(2, "35") # age 

self.treeWidget.addTopLevelItem(item) 
+0

そここんにちは、あなたの応答をありがとうございました。これはうまくいくようですが、私は理解できません。なぜこの方法はうまくいくのですか?私がしたのは、デザイナーでUIを作ってPythonスクリプトに変換し、それがどのように配置されたのかを考えてみることでした。 "topLevelItem(itemID).setText()"と "addTopLevelItem(item)"の違いは何ですか?私はこれをタイプするとき、私が潜在的に既存のアイテムが存在するときに私がなぜ機能しないのかを潜在的に見ることができることを意味するが、clear()関数を使っても同じ空白の結果を私に与えた... – user3696118

+0

@ user3696118 '既存の項目を更新すると、 'topLevelItem(itemID).setText()'が動作するはずです。しかし、新しい項目を追加するには、最初に 'QTreeWidgetItem'を作成し、上記のようにツリーに追加する必要があります。 – xyres

+0

qtreewidget.clear()はウィジェットの既存のデータを消去しませんか?私はすべてが消去されたら、ウィジェットが最初から読み込まれたかのように扱うことができると思いました。 – user3696118

関連する問題