Qt中实时获取cmd命令的输出
Get output of cmd command in real time in Qt
我在 Qt 中使用此代码来获取 cmd 命令的输出
QProcess c_output;
c_output.start("some-exe", QStringList() << "param1" << "param2" << "param3...");
if (!c_output.waitForStarted())
std::cout << false;
c_output.write("...");
c_output.closeWriteChannel();
if (!c_output.waitForFinished())
std::cout << false;
它的工作很好。
使用此代码,我可以使用 c_output.readAll()
访问输出,但问题是此代码等到 cmd 完成执行...然后在 c_output.readAll()
中提供所有输出,我想实时获取输出并将它们显示在我程序的 gui
我的意思是我推荐在 exec 之后打印多行,我想在我的程序中一一显示它们,而不是等待它完成。
您可以使用 waitForReadyRead
而不是 waitForFinished
,请参阅 https://doc.qt.io/qt-5/qprocess.html#waitForReadyRead
这是一个简单的用法示例:
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QProcess c_output;
c_output.setProcessChannelMode(QProcess::MergedChannels);
c_output.start("dmesg", QStringList() << "-w");
if (!c_output.waitForStarted()){
qDebug() << "Failed to start";
return -1;
}
c_output.write("...");
c_output.closeWriteChannel();
while (c_output.state() != QProcess::NotRunning)
{
qDebug() << ".";
if (c_output.waitForReadyRead())
qDebug() << "c_output" << c_output.readAllStandardOutput();
}
return app.exec();
}
我在 Qt 中使用此代码来获取 cmd 命令的输出
QProcess c_output;
c_output.start("some-exe", QStringList() << "param1" << "param2" << "param3...");
if (!c_output.waitForStarted())
std::cout << false;
c_output.write("...");
c_output.closeWriteChannel();
if (!c_output.waitForFinished())
std::cout << false;
它的工作很好。
使用此代码,我可以使用 c_output.readAll()
访问输出,但问题是此代码等到 cmd 完成执行...然后在 c_output.readAll()
中提供所有输出,我想实时获取输出并将它们显示在我程序的 gui
我的意思是我推荐在 exec 之后打印多行,我想在我的程序中一一显示它们,而不是等待它完成。
您可以使用 waitForReadyRead
而不是 waitForFinished
,请参阅 https://doc.qt.io/qt-5/qprocess.html#waitForReadyRead
这是一个简单的用法示例:
#include <QCoreApplication>
#include <QFile>
#include <QTextStream>
#include <QProcess>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
QProcess c_output;
c_output.setProcessChannelMode(QProcess::MergedChannels);
c_output.start("dmesg", QStringList() << "-w");
if (!c_output.waitForStarted()){
qDebug() << "Failed to start";
return -1;
}
c_output.write("...");
c_output.closeWriteChannel();
while (c_output.state() != QProcess::NotRunning)
{
qDebug() << ".";
if (c_output.waitForReadyRead())
qDebug() << "c_output" << c_output.readAllStandardOutput();
}
return app.exec();
}