【问题标题】:How to call an app that expects stdin input from QtGui?如何调用需要来自 QtGui 的标准输入的应用程序?
【发布时间】:2012-06-28 16:08:24
【问题描述】:

我正在使用 Ubuntu 和 Qt Creator 4

我有一个可执行形式的 .cpp 程序(比如abc.out),我希望在按下按钮时运行它。它包含许多 cin 和 cout,所以我希望它在“终端”(在 Ubuntu 上)上运行,以便我能够向它输入和输出值。我该怎么做?

我已经尝试过 system() 和 还, QProcess p1; p1.start(./abc.out);

使用 QProcess,我的可执行文件运行但在第一个 cout 处停止。它在 Qt Creator 的应用程序输出屏幕上运行,而不是在终端上。

例如: 我在应用程序输出中看到:

输入姓名:

当我在此处键入值并按 Enter 键时,它不接受该值,而是移至下一行并允许我进一步键入。 我想在终端上运行这个abc.out 文件。任何想法都会很有帮助。

【问题讨论】:

  • 我不确定我是否理解您的问题。您是否正在尝试编写一个使用 QProcess 启动其他应用程序的应用程序?在这种情况下,您必须明确处理用户输入如何发送到您的子应用程序。

标签: qt executable qprocess


【解决方案1】:

您是指 Qt Creator 2.4 吗?无论如何,在“项目”选项卡上,您应该找到“运行设置”部分,然后您可以从那里找到“在终端中运行”复选框。您还可以使用自定义可执行选项并在此处键入:gnome-terminal --command ./abc.out 确切的细节可能会有所不同,因为我使用的是 Qt Creator 2.5。

这在从 Qt Creator 启动时应该可以工作,但是当您在 IDE 之外使用您的应用程序时,您需要从终端启动它,而不是通过双击可执行文件来启动它。为了解决这个问题,我可以想到两种方法:

  1. 从 QtGui 启动一个终端窗口(类似于 QProcess::execute("gnome-terminal --command ./abc.out"); ),但问题是不同的系统有不同的终端名称。
  2. 自己提供一个 Qt 输入/文本框作为 GUI 的一部分,然后将用户输入转发到可执行文件(类似于 myqprocess.write(input_asked_from_user_by_QtGui); )。在这里,您可能需要事先知道要向用户询问哪些信息。如果要显示启动进程的cout输出,可以使用read方法和QProcess的朋友。

【讨论】:

  • 我想我不是很清楚。无效 MainWindow::on_pushButton_clicked() { QProcess p1; p1.execute("./obj.out");这是我的代码。 obj.out 有许多 cin 和 cout。我该如何处理?第一个 cout 出现在 creator 的应用程序输出窗口中。我想如果我可以让 obj.out 中的 std::cin 和 std::cout 出现在像 gcc 这样的终端上,这个问题就会消失
  • @user1484717 - 这就是我在回答中试图解决的问题。我用一些实现提示对其进行了修改。
  • 谢谢。我启动了一个终端窗口并能够使用它进行管理
【解决方案2】:

根据您的问题,我假设您正在编写一个使用 QProcess 启动其他应用程序的应用程序。很好,但是如果您的子进程正在等待来自标准输入的数据,它将永远等待,因为您没有提供任何数据。您的父应用程序的标准输入无法自动引导到子进程。想象一下,您正在从您的主应用程序启动两个进程。输入应该去哪个子进程?

如果您想与子进程通信,您必须使用 QProcess 的 QIODevice 方法并从/向该应用程序发送/读取数据。

【讨论】:

    【解决方案3】:

    唯一明智的解决方案是在终端中启动目标应用程序。是您自己的代码提供终端窗口还是重用现有的终端应用程序取决于您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多