我希望cmd.exe
使用QProcess
而不是startDetached
,因为我需要与正在运行的cmd进行交互。并且cmd必须是forground。我想在第一个进程完成后得到readyRead()
然后我会做一些其他任务,比如显示一些消息框或启动另一个cmd.exe或在该cmd窗口中执行另一个命令。但是cmd窗口必须对用户可见。
答案 0 :(得分:1)
听起来你想运行一个命令行进程(或几个),在运行时显示它的输出,然后在完成后运行另一个进程。
我通常在主窗口中使用只读QPlainTextEdit来向命令行显示io。在堆上创建QProcess并将connect
其readyReadStandardError和readyReadStandardOutput信号发送到主窗口中的一个插槽,该插槽将文本打印到QPlainTextEdit。然后使用QProcess::start的参数启动命令行程序并等待它完成。完成后,以相同的方式开始下一个过程。
答案 1 :(得分:0)
你也可以在你的GUI旁边的Qt中启用一个控制台。
Console output in a Qt GUI app?
然后使用qDebug
调用将文本输出到调试窗口,或者使用iostream
和std::cout
使用std::cin
。
编辑: 要显示控制台,请在.pro中添加“CONFIG + = console”,然后在Project>中添加运行设置,请务必选中“在终端中运行”。
EDIT2:
https://www.google.com/search?q=qprocess+cmd
http://www.qtcentre.org/threads/12757-QProcess-cmd
#include <QByteArray>
#include <QProcess>
#include <iostream>
#include <string>
using namespace std;
int main(int argc,char** argv)
{
QProcess cmd;
cmd.start("cmd");
if (!cmd.waitForStarted())
return false;
cmd.waitForReadyRead();
QByteArray result = cmd.readAll();
cout << result.data();
string str;
getline(cin,str);
while(str != string("exit"))
{
cmd.write(str.c_str());
cmd.write("\n");
cmd.waitForReadyRead();
result = cmd.readAll();
cout << result.data();
getline(cin,str);
}
}
我在这里测试了代码,它允许你与命令行交互并通过readyread()获得输出,但是如果你使用GUI运行它,你将需要在从主要的循环中移动它在另一个线程中。