【问题标题】:Qt: How do I write data immediately to a QProcess?Qt:如何立即将数据写入 QProcess?
【发布时间】:2020-09-21 15:09:01
【问题描述】:

我的 QProcess 非常简单,类似于:

#include <iostream>
#include <string>

int main() {
std::string a, b;
std::cout<<"Enter value of a: ";
std::cin>>a;
std::cout<<std::endl;
std::cout<<"Now, enter value of b: ";
std::cin>>b;
std::cout<<std::endl;
std::cout<<"Value of a is "<<a<<" and value of b is "<<b<<std::endl;

return 0;
}

请注意,我无法更改上述代码。无论流程如何,Qt 代码都应该可以工作。

据我了解,QProcess::write(const char *data) [继承自QIODevice] 将数据发送到缓冲区但不直接将其发送到标准中,除非写入通道关闭,或者进程已完成。

但是,我需要在调用QProcess::write(const char *data) 时直接将数据发送到标准,因为在第一个std::cin 之后我无法关闭通道,否则第二个std::cin 什么也得不到。所以我想向进程发送一些数据,因为它要求它[就像在命令行上运行这段代码一样],我不知道如何用 Qt 做到这一点。

另外,我不认为waitForBytesRead()会做得很好,因为它只是在将第一组数据输入缓冲区时等待,并且该过程不会继续。

QProcess相关代码:

  QProcess my_proc = new QProcess();
  QString program = "powershell.exe";
  QStringList prog_args;
  prog_args << "-Command" << "./main"
  my_proc->setProcessChannelMode(QProcess::MergedChannels);
  my_proc->setProgram(program);
  my_proc->setArguments(prog_args);
  my_proc->start();
  my_proc->waitForStarted();

~程序的输出被打印在 QTextBrowser 或任何类似的小部件上。所以我知道它什么时候需要相关的输入。~

~在另一个QTextEdit qinput 或类似的,我输入了我想发送给进程的字符串,这是由:

if ( my_proc->state() == QProcess::Running) {
my_proc->write(qinput->toPlainText().toStdString().c_str());
}

~从这里开始没有任何反应,所以“现在输入 b 的值”这一行不会显示~

【问题讨论】:

  • 请同时显示带有QProcess的代码
  • 也许你需要一种方法来刷新。但是 QProcess/QIODevice 没有提供。
  • @idclev463035818 如果这些位可能相关,我提供了更多代码。

标签: c++ qt


【解决方案1】:

当有QStringQByteArray 时,不需要使用...toStdString().c_str()

执行以下操作:

if ( proc->state() == QProcess::Running) 
{
    proc->write(qinput->toPlainText().toUtf8() + "\n"); // as I understand, \n will flush the line
}

注意,你也可以使用proc-&gt;write("\n");来模拟“按任意键”

【讨论】:

  • 是的,那是完全丢失了.. 非常感谢!你认为添加换行符是一个跨平台的解决方案,相对于 Qt gui 的运行位置和相对于主进程(如果它是用另一种编程语言编写的)?
  • @MoKanj 据我所知,是的,它是跨平台的。另见stackoverflow.com/a/27620074/4149835
  • 但是,附加换行符\n 会呈现输入,但实际上并没有换行。除了附加\n\n [因为这不起作用]之外,还有其他解决方法吗?
  • @MoKanj 看到这个 - stackoverflow.com/a/36738723/4149835
  • 因此将\n 附加到基于 C++ 的进程是有效的;但是,对于类似编写的 C# 控制台应用程序,它并没有完成这项工作。它只是在输入第一个字符串后等待...由于我对 C# 的了解不多,您知道那里的工作原理吗?
【解决方案2】:

您可以尝试刷新标准输入流:

fflush(stdin);

或使用getline:

std::string myString;
std::getline(std::cin, myString);

当输入(换行符)时,这将结束阅读

【讨论】:

  • 问题是我不允许编辑 QProcess 主代码。所以我希望 Qt 代码无论进程的主代码如何都能正常工作。
  • 刷新输入流是undefined behavior
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
相关资源
最近更新 更多