使用 PyQt 和 Python 我遇到了以下问题:
- 设置一个 QFileSystemModel,调用 setRootPath() 并连接到 dataChanged 信号。
- 从 Python 打开一个新文件并在其中写入一些文本。然后关闭它。
- 以追加模式重新打开文件并在其中写入更多文本。然后关闭它。
- 在外部编辑器中打开文件。写点东西。节省。多写点东西。节省。
如果您执行 (3),则不会发出 dataChanged 信号。但是,如果您执行 (4),则会发出 dataChanged 信号。
有什么线索吗?下面包含一个重现该问题的代码片段。
此致,
麦兹
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_())
以下是一些更一般的观察:
基本问题是 QFileSystemModel 显然没有以正确的方式监视文件更改:
案例 1(Ubuntu):
1) 在后台运行脚本作为 'python fsm.py &' 2) 在启动脚本的同一目录中启动 Python 提示符 3) 键入:
f = open('foo.txt', 'w')
f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
f.close()
当调用 open() 时,QFileSystemModel 检测到新文件。但是,没有检测到由 f.write() 和 f.close() 引起的文件修改。
案例 2(Ubuntu):
1)当脚本'fsm.py'仍在运行时,使用一些外部编辑器(gedit,emacs等)打开一个新文件2)写一些东西并保存
在这种情况下,新文件和修改都会被检测到。这是我不明白的第一件事。为什么没有检测到 Python IO 但来自编辑器的 IO 是?
案例 3(Ubuntu):
使用 Ubuntu:我启动 Nautilus 文件浏览器并重复案例 1-2 中的步骤 1-3。然后 nautilus 检测到新文件和修改。所以那里 Python 生成的 IO 被监控,但显然是使用 GNOME 文件监控系统。
案例 1(Windows 7):
相同的行为。
案例 2(Windows 7):
如果使用记事本或写字板,则不会检测到文件修改。如果使用 GVim 7.3,则会检测到文件修改。
案例 3(Windows 7):
启动本机 Windows 7 文件浏览器,检测到案例 1-2 中的所有模块。
你能理解这个吗?