私は、指定されたパスのテキストと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にデータを正しく更新させる方法はありますか?それとも、これを完全に再フォーマットする必要がありますか?
ありがとうございます。
そここんにちは、あなたの応答をありがとうございました。これはうまくいくようですが、私は理解できません。なぜこの方法はうまくいくのですか?私がしたのは、デザイナーでUIを作ってPythonスクリプトに変換し、それがどのように配置されたのかを考えてみることでした。 "topLevelItem(itemID).setText()"と "addTopLevelItem(item)"の違いは何ですか?私はこれをタイプするとき、私が潜在的に既存のアイテムが存在するときに私がなぜ機能しないのかを潜在的に見ることができることを意味するが、clear()関数を使っても同じ空白の結果を私に与えた... – user3696118
@ user3696118 '既存の項目を更新すると、 'topLevelItem(itemID).setText()'が動作するはずです。しかし、新しい項目を追加するには、最初に 'QTreeWidgetItem'を作成し、上記のようにツリーに追加する必要があります。 – xyres
qtreewidget.clear()はウィジェットの既存のデータを消去しませんか?私はすべてが消去されたら、ウィジェットが最初から読み込まれたかのように扱うことができると思いました。 – user3696118