我在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
这样的命令(我不知道正确的术语)?
我是在做错了还是只有另一种方法可以将输出输出到我的进度窗口?
答案 0 :(得分:0)
m_myProcess
是班级MainWindow
的成员,您无法让班级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);
}