Изменения файла, сгенерированные Python, не обнаружены QFileSystemModel
Используя 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()
Новый файл обнаружен 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.
Можете ли вы понять это?