Изменения файла, сгенерированные Python, не обнаружены QFileSystemModel

Используя 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()

Новый файл обнаружен QFileSystemModel при вызове open(). Однако изменения файла, вызванные f.write() и f.close(), НЕ обнаруживаются.

Случай 2 (Ubuntu):

1) Пока скрипт "fsm.py" еще работает, откройте новый файл с помощью внешнего редактора (gedit, emacs и т. Д.) 2) Напишите некоторые вещи и сохраните

В этом случае обнаруживаются как новый файл, так и модификация. Это первое, что я не понимаю. Почему Python IO не обнаружен, а IO от редактора есть?

Случай 3 (Ubuntu):

Использование Ubuntu: я запускаю файловый браузер Nautilus и повторяю шаги 1-3 из варианта 1-2 Затем новый файл и его модификация обнаруживаются nautilus. Таким образом, мониторинг сгенерированных Python операций ввода-вывода осуществляется с использованием системы мониторинга файлов GNOME.

Случай 1 (Windows 7):

Такое же поведение

Случай 2 (Windows 7):

Если используется Блокнот или Wordpad, изменения файла НЕ обнаруживаются. Если используется GVim 7.3, обнаружены изменения файла.

Дело 3 (Windows 7):

При запуске родного файлового браузера Windows 7 обнаруживаются все моды из Case 1-2.

Можете ли вы понять это?

0 ответов

Другие вопросы по тегам