【问题标题】:Piping log output to QTextEdit widget管道日志输出到 QTextEdit 小部件
【发布时间】:2014-03-06 20:15:09
【问题描述】:

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。

【问题讨论】:

  • QIODevice(以及 QFile)有一个 readyRead() 信号,你可以连接到。
  • 我在上面的代码中添加了以下内容:
  • QObject.connect(file, SIGNAL("readyRead()"), self.blap) def blap(self): print "I SAW that change"
  • 我也尝试过 'bytesWritten() 信号。我删除了file.close,以防万一。然后我在命令行做了: echo 'foo'>> tmp 但它没有触发信号。我错过了什么?
  • @FrankOsterfeld QFile 在其他人修改文件时不会发出此类信号。事实上,QFile 不会发出任何信号周期。是的,它有它们,但从不发出它们。您真的不希望它默认发生,因为在许多系统上,文件更改通知非常昂贵,并且您会为通过 QFile 打开的每个文件支付这个价格。在实践中,那将是非常非常糟糕。就我而言,运行带有大量打开文件的 Qt 应用程序对它们运行的​​机器来说是一个很好的拒绝服务:)

标签: qt qtextedit qiodevice qtextstream


【解决方案1】:

QFile 不提供监控文件内容更改的机制。您需要使用QFileSystemWatcher 来获得有关文件更改的通知。您还需要明智地处理您可能会在文件末尾读取部分行的事实。

如果您使用fileChanged 信号,请确保提供文件(而不是文件夹)的路径,并且addPath 返回 True。

您可以尝试同时监控文件路径和目录路径 - 在某些系统上,一个可以工作,而另一个会失败。

如果您使用的是 OS X 以外的 Unices,您可能只是关闭了文件系统通知守护程序(如果有必要),或者关闭了给定文件系统的通知等。如您所见,取决于正在工作的文件系统观察程序充满危险。如果观察者失败,您必须轮询文件大小和修改时间(不经常!)。

QTextEdit 附加后的性能相当差。您应该使用模型和QListView,而不是with some caveats

【讨论】:

  • 抱歉打扰了...我知道有:
  • watcher = QFileSystemWatcher() watcher.addPath('tmp') QObject.connect(watcher, SIGNAL("fileChanged()"), self.blap)
  • 但仍然看不到文件更改的信号。 (我还没有弄清楚如何在 cmets 中格式化代码——对不起)。
  • 听起来我需要另一种方法。我将尝试使用 QProcess 或使用 subprocess 模块连接管道
猜你喜欢
  • 1970-01-01
  • 2016-04-03
  • 2012-12-06
  • 2019-10-26
  • 2012-08-05
  • 1970-01-01
  • 2023-04-04
  • 2019-02-03
相关资源
最近更新 更多