QFileSystemModel未检测到Python生成的文件更改

时间:2012-05-22 10:02:49

标签: python qt pyqt qfilesystemmodel

使用PyQt和Python我遇到了以下问题:

  1. 设置QFileSystemModel,调用setRootPath()并连接到dataChanged信号。
  2. 从Python打开一个新文件并将一些文本写入其中。然后关闭它。
  3. 以附加模式重新打开文件并在其中写入更多文本。然后关闭它。
  4. 在外部编辑器中打开文件。写一些东西。保存。写更多东西。保存。
  5. 如果你这样做(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(Ubuntu):

    1)在后台运行脚本'python fsm.py&' 2)在启动脚本的同一目录中启动Python提示符 3)类型:

    f = open('foo.txt', 'w')
    f.write('eyeyehydhdhdhdhdhdhhdhdshshs')
    f.close()
    

    调用open()时,QFileSystemModel检测到新文件IS。但是,未检测到由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中的所有模块。

    你可以从中得到任何意义吗?

0 个答案:

没有答案