1

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

  1. 设置一个 QFileSystemModel,调用 setRootPath() 并连接到 dataChanged 信号。
  2. 从 Python 打开一个新文件并在其中写入一些文本。然后关闭它。
  3. 以追加模式重新打开文件并在其中写入更多文本。然后关闭它。
  4. 在外部编辑器中打开文件。写点东西。节省。多写点东西。节省。

如果您执行 (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 中的所有模块。

你能理解这个吗?

4

0 回答 0