在另一个窗口中显示 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_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);
【讨论】:
Uhhm 我在哪里放 QProcess* MainWindow::getProcess() return m_myProcess; 在主窗口中。你是从 C++ 开始的吗? 当我编辑我的评论时它没有改变。我把 mainwindow.h public: 并得到了错误:错误:额外的资格 'MainWindow::' on member 'getProcess' 您遇到了 c++ 语法问题,很抱歉,但我不会修复您遇到的所有编译错误。直接在 SO 或谷歌上搜索它们。祝你好运。 在尝试了一点点并进行了很多试验之后,由于您的代码,它起作用了。以上是关于在另一个窗口中显示 QProcess 输出的主要内容,如果未能解决你的问题,请参考以下文章
PyQt4 QProcess.startDetached() - 无法获得衍生进程的返回值和 PID