QFileSystemModel未检测到Python生成的文件更改
使用PyQt和Python,我遇到了以下问题:QFileSystemModel未检测到Python生成的文件更改,python,qt,pyqt,qfilesystemmodel,Python,Qt,Pyqt,Qfilesystemmodel,使用PyQt和Python,我遇到了以下问题: 设置QFileSystemModel,调用setRootPath()并连接到dataChanged信号 从Python中打开一个新文件,并在其中写入一些文本。然后关上它 以追加模式重新打开文件,并在其中写入更多文本。然后关上它 在外部编辑器中打开文件。写一些东西。拯救写更多的东西。保存 如果执行(3),则不会发出dataChanged信号。但是,如果执行(4),则会发出dataChanged信号 有什么线索吗?下面包含一个重现该问题的代码段 致以最
你能理解这一点吗?快速猜测:编辑器不会附加到文件,而是替换文件?运行该代码,我确实会更改
数据。也许这取决于Python版本和/或操作系统。我尝试了Python 2.7、PyQt 4.9.1,Qt 4.8.1在Ubuntu上。你确定对于第三种情况,dataChanged
信号没有发出吗?因为当我运行你的代码时,这是我的输出,我得到了dataChanged
信号,当我试图对文件进行其他更改时,通过在记事本中编辑,没有发出dataChanged
信号。如果我理解你,好吗正确地说,最初发出的dataChanged
不是针对文件foo.dat
。好的,但正如您所提到的,dataChanged
是针对案例4发布的,但至少不是针对我。所以对我来说,dataChanged
最初只发布一次,之后无论我做什么,都不会发布。@repoman:Modified Date
。如果希望观察,请将视图更改为QTreeView
,并在显示窗口后修改文件(如果稍微延迟一点,效果会更好)。Python修改文件,修改日期实际上会更改,但视图不会更新。事实上,我不认为对单个文件进行监控(可能太贵了)。重命名文件会触发rowsRemoved
,然后触发rowsInserted
。
import sys
import os
from PyQt4 import QtGui, QtCore
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
QtGui.QWidget.__init__(self, parent)
layout = QtGui.QVBoxLayout()
self.setLayout(layout)
self._view = QtGui.QListView()
layout.addWidget(self._view)
# Add the model
self._model = QtGui.QFileSystemModel()
self._model.setRootPath(QtCore.QDir().rootPath())
self._model.setReadOnly(False)
self._model.setFilter(QtCore.QDir.AllDirs | QtCore.QDir.AllEntries)
self._view.setModel(self._model)
# Root path
path = os.path.dirname(os.path.abspath(__file__))
self._model.setRootPath(path)
# Set a root index
index = self._model.index(path)
self._view.setRootIndex(index)
# Generate a file with some text
print 'Making file'
f = open('foo.dat', 'w')
f.write('Some stuff\n')
f.close()
self.connect(self._model, QtCore.SIGNAL('dataChanged(const QModelIndex &, const QModelIndex &)'), self.dataChanged)
# Append more text - this should trigger a signal call
print 'Modifying file'
f = open('foo.dat', 'w+')
f.write('Some more stuff\n')
f.close()
def dataChanged(self, index_0, index_1):
print 'dataChanged', self._model.filePath(index_0), self._model.filePath(index_1)
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
widget = Widget()
widget.show()
sys.exit(app.exec_())
f = open('foo.txt', 'w')
f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
f.close()