仅当 QProcess Stdout 包含子字符串时才打印它

Posted

技术标签:

【中文标题】仅当 QProcess Stdout 包含子字符串时才打印它【英文标题】:Printing QProcess Stdout only if it contains a Substring 【发布时间】:2017-07-13 17:52:04 【问题描述】:

PyQt4 应用程序在 QProcess 中运行 ping。一个名为 self.outputQTextEdit 将输出来自 ping 的所有内容。第二个名为self.summaryQTextEdit 将仅输出包含字符串TTL 的行。

问题:我设法让self.output 工作,但不是self.summary,因为我不确定如何在dataReady 函数中编写它的代码。有什么想法吗?

import sys
from PyQt4 import QtGui, QtCore


class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.initUI()


    def dataReady(self):
        cursorOutput = self.output.textCursor()
        cursorSummary = self.summary.textCursor()

        cursorOutput.movePosition(cursorOutput.End)
        cursorSummary.movePosition(cursorSummary.End)

        processStdout = str(self.process.readAll())

        # Update self.output
        cursorOutput.insertText(processStdout)

        # Update self.summary
        for line in processStdout:
            if 'TTL' in line:
                cursorSummary.insertText(line)


        self.output.ensureCursorVisible()
        self.summary.ensureCursorVisible()


    def callProgram(self):
        self.process.start('ping', ['127.0.0.1'])


    def initUI(self):
        layout = QtGui.QHBoxLayout()
        self.runBtn = QtGui.QPushButton('Run')
        self.runBtn.clicked.connect(self.callProgram)

        self.output = QtGui.QTextEdit()
        self.summary = QtGui.QTextEdit()

        layout.addWidget(self.runBtn)
        layout.addWidget(self.output)
        layout.addWidget(self.summary)

        centralWidget = QtGui.QWidget()
        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)

        # QProcess object for external app
        self.process = QtCore.QProcess(self)
        self.process.readyRead.connect(self.dataReady)
        self.process.started.connect(lambda: self.runBtn.setEnabled(False))
        self.process.finished.connect(lambda: self.runBtn.setEnabled(True))


def main():
    app = QtGui.QApplication(sys.argv)
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

您可能遇到的一个问题是QProcess 的每个输出可能有几行,即包含"\n",为了没有这个问题我们将它分开,然后我们进行搜索:

for line in processStdout.split("\n"):
    if "TTL" in line:
        cursorSummary.insertText(line+"\n")

在您的初始代码中,您使用 for 循环获取每个字符,这会产生错误。

注意: 在 linux 中,我必须按单词 ttl 进行过滤。除了将 QProcess 更改为:self.process.start('ping', ['-c', '3', '127.0.0.1'])

【讨论】:

以上是关于仅当 QProcess Stdout 包含子字符串时才打印它的主要内容,如果未能解决你的问题,请参考以下文章

在槽中获取 qprocess 输出

如何使用 QProcess 等待子进程?

如何在 Windows 上通过 QProcess 启动提升的子进程?

如何使用子进程或 QProcess 启动独立的 gnuplot 进程?

在字符串中查找子字符串,但仅当整个单词?

Qt使用QProcess进程间双向通信(linux和win系统)