使用PyQt和Python我遇到了以下问题:
如果你这样做(3),则不发出dataChanged信号。但是,如果你这样做(4),则发出dataChanged信号。
任何线索?下面列出了重现该问题的代码段。
致以最诚挚的问候,
的Mads
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)在后台运行脚本'python fsm.py&' 2)在启动脚本的同一目录中启动Python提示符 3)类型:
f = open('foo.txt', 'w')
f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
f.close()
调用open()时,QFileSystemModel检测到新文件IS。但是,未检测到由f.write()和f.close()引起的文件修改。
1)当脚本'fsm.py'仍在运行时,使用一些外部编辑器(gedit,emacs等)打开一个新文件 2)写一些东西并保存
在这种情况下,检测新文件和修改。这是我不明白的第一件事。为什么没有检测到Python IO,但是来自编辑器的IO是什么?
使用Ubuntu:我启动Nautilus文件浏览器并重复案例1-2中的步骤1-3。然后nautilus检测到新文件和修改。因此,Python生成的IO被监视,但显然使用GNOME文件监视系统。
同样的行为。
如果使用记事本或写字板,则不会检测到文件修改。如果使用GVim 7.3,则检测到文件修改。
启动本机Windows 7文件浏览器,检测案例1-2中的所有模块。
你可以从中得到任何意义吗?