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

时间:2014-08-15 08:09:35

标签: c++ qt pipe signals-slots qprocess

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

mainwindow.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);

          }

progress.cpp

void Progress::printOutput()
{


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

我知道它非常混乱iv'e尝试了很多东西并且没有清理代码但是我对c ++很新。 我的目标是通过连接发送QProcess(m_myProcess)进展,但这似乎不起作用。 你可以通过连接到其他窗口发送像readyReadAllStandardOutput这样的命令(我不知道正确的术语)? 我是在做错了还是只有另一种方法可以将输出输出到我的进度窗口?

1 个答案:

答案 0 :(得分:0)

m_myProcess是班级MainWindow的成员,您无法让班级Progress看到它。这就是为什么你有 编译错误

的原因
  

m_myProcess未在此范围内声明

你能做什么:

  1. Redirect standard error of m_myProcess to standard output,这样您也可以打印发送到标准错误的内容(除非您想对其执行其他操作)。使用

    m_myProcess.setProcessChannelMode(QProcess::MergedChannels);  
    
  2. MainWindow

    之外设置流程对象
    QProcess* MainWindow::getProcess()
    {
       return  m_myProcess;
    }
    
  3. 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);
    }