Вывод журнала конвейера в виджет QTextEdit

В stackoverflow есть несколько «похожих» вопросов, но я не могу их реализовать. В pyqt я пытаюсь направить вывод файла журнала (который обновляется в режиме реального времени) в виджет QTextEdit. Код, который у меня есть до сих пор:

    file = QFile('tmp')
    fh = file.open(QIODevice.ReadOnly)
    stream = QTextStream(file)
    while not stream.atEnd():
        line = stream.readLine()
        self.logTextEdit.append(line)
    file.close()

который обрабатывает текущее содержимое, но не любые последующие изменения. В идеале сигнал Qt предупредил бы меня о том, что нужно прочитать другую строку, когда она доступна, и записать ее непосредственно в TextEdit.


person Paul Nelson    schedule 06.03.2014    source источник
comment
QIODevice (и, следовательно, QFile) имеет сигнал readyRead(), к которому вы можете подключиться.   -  person Frank Osterfeld    schedule 07.03.2014
comment
Я добавил следующее в код выше:   -  person Paul Nelson    schedule 07.03.2014
comment
QObject.connect(file, SIGNAL(readyRead()), self.blap) def blap(self): print Я ВИДЕЛ это изменение   -  person Paul Nelson    schedule 07.03.2014
comment
Я также пробовал сигнал 'bytesWritten(). Я удалил файл .close на всякий случай. Затем я в командной строке сделал: echo 'foo'›› tmp, но это не вызвало сигнал. Что мне не хватает?   -  person Paul Nelson    schedule 07.03.2014
comment
@FrankOsterfeld QFile не подает такие сигналы, когда другие изменяют файл. На самом деле QFile не излучает период никаких сигналов. Да, они у него есть, но он никогда их не излучает. Вы действительно не хотели бы, чтобы это происходило по умолчанию, поскольку во многих системах уведомления об изменении файлов очень дороги, и вы будете платить эту цену за каждый файл, открытый через QFile. На практике это было бы очень, очень плохо. Насколько я понимаю, запуск приложений Qt с большим количеством открытых файлов был бы хорошим отказом в обслуживании на машине, на которой они работают :)   -  person Kuba hasn't forgotten Monica    schedule 07.03.2014
comment
@Kuba Ober: правильно, неправильно прочитал требования ... Я думал, что речь идет о постепенном чтении существующего файла, но, конечно, речь не об этом.   -  person Frank Osterfeld    schedule 07.03.2014


Ответы (1)


QFile не предлагает механизма отслеживания изменений в содержимом файла. Вам нужно использовать QFileSystemWatcher, чтобы получать уведомления об изменениях в файле. Вам также необходимо разумно справляться с тем фактом, что вы можете прочитать неполные строки в конце файла.

Убедитесь, что вы указываете путь к файлу (а не к папке), если вы используете сигнал fileChanged, и что addPath возвращает True.

Вы можете попробовать отслеживать как путь к файлу, так и путь к каталогу - на некоторых системах один будет работать, а другой - нет.

Если вы используете Unices, отличную от OS X, у вас могут быть просто отключены демоны уведомлений файловой системы (если таковые необходимы) или уведомления отключены для данной файловой системы и т. д. Как вы можете видеть, в зависимости от работающей файловой системы наблюдатель чреват Опасность. Если наблюдатель терпит неудачу, у вас должен быть запасной вариант опроса размера файла и времени модификации (не очень часто!).

QTextEdit довольно плохо работает при добавлении. Вместо этого вы должны использовать модель и QListView, с некоторыми оговорками.

person Kuba hasn't forgotten Monica    schedule 06.03.2014
comment
Извините, что мучаю это... Я знаю: - person Paul Nelson; 07.03.2014
comment
watcher = QFileSystemWatcher() watcher.addPath('tmp') QObject.connect(watcher, SIGNAL(fileChanged()), self.blap) - person Paul Nelson; 07.03.2014
comment
Но по-прежнему не вижу сигнала об изменении файла. (Я также еще не понял, как форматировать код в комментариях - извините). - person Paul Nelson; 07.03.2014
comment
Похоже, мне нужен другой подход. Я попробую что-нибудь с помощью QProcess или соединения каналов с помощью модуля подпроцесса. - person Paul Nelson; 07.03.2014