在另一个窗口中显示 QProcess 输出

Posted

技术标签:

【中文标题】在另一个窗口中显示 QProcess 输出【英文标题】:Display QProcess output in another window 【发布时间】:2014-08-15 08:09:34 【问题描述】:

我在 Ubuntu 上使用 QT Creator。 我有一个带有主窗口的 GUI 和另一个名为“进度”的窗口。 单击按钮后,QProcess 将启动并执行 rsync 命令,该命令将文件夹复制到特定目录中。我创建了一个文本浏览器,它读取 rsync 命令的输出。同样单击该按钮会弹出“进度”窗口。 到目前为止一切顺利,现在我的问题。 我不想在我的主窗口中显示 rsync 输出,而是希望它正在进行中。 我尝试了几种方法来通过 connect 让 QProcess 进入进度,但这似乎不起作用。

主窗口.cpp

void MainWindow::on_pushButton_clicked()


         if (ui->checkBox->isChecked()
           )
       m_time ="-t";


    QObject parent;
    m_myProcess =  new QProcess();
    connect(m_myProcess, SIGNAL(readyReadStandardOutput()),this, SLOT(printOutput()));

           QString program = "/usr/bin/rsync";

           arguments << "-r" << m_time << "-v" <<"--progress" <<"-s"

               << m_dir
               << m_dir2;




           m_myProcess->start(program, arguments);

          

进度.cpp

void Progress::printOutput()



  ui->textBrowser->setPlainText(m_myProcess->readAllStandardOutput());

我知道这很混乱,我尝试了很多东西,但还没有清理代码,但我对 c++ 还是很陌生。 我的目标是通过连接发送 QProcess (m_myProcess) 以进行,但这似乎不起作用。 您可以通过连接到其他窗口发送readyReadAllStandardOutput 之类的命令吗(我不知道正确的术语)? 我是做错了还是有其他方法可以将输出显示到我的进度窗口?

【问题讨论】:

请发布一个最小的例子。这几乎是不可读的。 Check out this answer to a related question for QProcess->progressbar mechanisms 好的,现在应该可以阅读了。希望......这也不是我的问题,但对未来仍然有用,谢谢。 发生了什么?什么都没有显示? 不,当我尝试运行它时,我收到一个错误,即 m_myProcess 未在 progress.cpp 范围内声明。 "m_myProcess' 未在此范围内声明" 这是一个编译错误facepalm 【参考方案1】:

m_myProcessMainWindow 类的成员,而您尚未使其对 Progress 类可见。这就是您出现编译错误

的原因

m_myProcess 未在此范围内声明

你能做什么:

    Redirect standard error of m_myProcess to standard output,这样您还可以打印发送到标准错误的内容(除非您想用它做其他事情)。使用

    m_myProcess.setProcessChannelMode(QProcess::MergedChannels);  
    

    使进程对象在MainWindow之外可用

    QProcess* MainWindow::getProcess()
    
       return  m_myProcess;
    
    

    Progress中逐行读取进程输出。它需要保存在缓冲区中,因为readAllStandardOutput() 只返回自上次读取以来已写入的数据。

    ... // somewhere
    connect(window->getProcess(), SIGNAL(readyReadStandardOutput()), this, SLOT(printOutput())
    ...
    
    void Progress::printOutput()
       //bigbuffer is member
       bigbuffer.append(myProcess->readAllStandardOutput();)
       ui->textBrowser->setPlainText(bigbuffer);
    
    

【讨论】:

Uhhm 我在哪里放 QProcess* MainWindow::getProcess() return m_myProcess; 在主窗口中。你是从 C++ 开始的吗? 当我编辑我的评论时它没有改变。我把 mainwindow.h public: 并得到了错误:错误:额外的资格 'MainWindow::' on member 'getProcess' 您遇到了 c++ 语法问题,很抱歉,但我不会修复您遇到的所有编译错误。直接在 SO 或谷歌上搜索它们。祝你好运。 在尝试了一点点并进行了很多试验之后,由于您的代码,它起作用了。

以上是关于在另一个窗口中显示 QProcess 输出的主要内容,如果未能解决你的问题,请参考以下文章

PyQt4 QProcess.startDetached() - 无法获得衍生进程的返回值和 PID

带有 CreateNoWindow 的 QProcess

在 textBrowser 中实时显示 QProcess 输出

PyQt:多个 QProcess 和输出

在槽中获取 qprocess 输出

使用 QProcess 时无法读取命令的输出