如何在Qt中的Linux下打开启动进程的控制台窗口?

时间:2018-05-31 11:17:30

标签: linux qt qprocess

我使用QProcess打开控制台窗口但没有显示窗口。

QProcess *process = new QProcess();
process->startDetached(command);

我想打开一个窗口来启动文本模式命令,例如adb -s xxxxx shell打开一个shell窗口来访问Android设备。

我找到了关键字CREATE_NEW_CONSOLE但我不知道使用它。

2 个答案:

答案 0 :(得分:0)

我有一个解决方案,但我认为这是不好的方式:

QString program = "gnome-terminal";
QStringList arguments = QStringList()<<"-e"<< adbCommand;
process->startDetached(program, arguments);

答案 1 :(得分:0)

在Windows上,有关控制台和GUI可执行文件的在可执行格式级别;当启动控制台可执行文件时,操作系统本身要么回收当前控制台(如果父进程本身已经存在于控制台中),要么为新启动的进程分配一个新进程。

在Linux上,没有这样的区别;系统不知道有关终端仿真器(常规应用程序)的事情,并且当启动可执行文件时,它从父代继承控制终端(尽管有可能影响此的系统调用),附加stdin / stdout / stderr它(再次,除非执行重定向)并开始做它的东西。 GUI程序只是不希望通过终端进行交互并且“发生”与X(或Wayland)服务器通信的程序,但同样,系统无法知道这一点,这都是惯例。

要解决您的问题:当您从“GUI”应用程序直接adbQProcess时,子进程会继承您的应用程序所具有的任何控制终端;所以,如果您的程序是通过Qt创建者启动的,您将在“应用程序输出”窗格中看到它的输出,当您从控制台启动它时,您将能够通过它与adb进行交互,等等上。

如果要将adb打开到一个单独的终端,则必须明确启动终端模拟器,并依次告诉它adb;一旦你知道你想要启动什么是终端模拟器,这通常很简单,因为任何值得使用的终端模拟器都会接受-e program_name arguments选项(模仿xterm)。

然而,我们处于一种悲惨的境地,因为在典型的Linux时尚中,没有标准的,桌面无关的方式来了解什么是“默认”终端模拟器,即使几乎每个DE /面板/具有此设置的任何东西某处。

寻找这种与桌面无关的东西的地方通常是freedesktop.org(以前称为X桌面组,因此你会在很多东西中看到的首字母缩略词XDG),其中{{3}关于这类问题 1 。您可以在a still unresolved bug from 2015中看到已经考虑修复它的方法,但AFAIK它已经消失了。

所以,在我看来,你有两个选择:

  • 刚刚发布xterm;它不是特别漂亮,但没有图形Linux安装,没有它就会发布(即使它不是“真正的”xterm,也会有一个恰当命名的符号链接),所以你确定它会工作

    QStringList arguments;
    // keep your arguments separated to avoid surprises with escaping
    arguments << "-e" << "adb" << "-s" << "xxxx" << "shell";
    process->startDetached("xterm", arguments);
    
  • 如果您希望对用户特别好,可以让终端模拟器使用默认设置为xterm的设置,以保证一般情况下正常工作。

在任何情况下,请不要对您的特定DE使用的终端仿真器进行硬编码 - 并非所有人都使用gnome-terminal,而且许多人甚至没有安装它。

  1. 问题尤其是“遇到xdg-open(=启动器)文件时应该.desktop应该做什么,这些文件说”这个程序必须在一个单独的控制台中运行“,这几乎就是你正试图解决的问题。如上所述,几乎任何DE都尊重这个标志,但桌面无关xdg-open不能,因为没有办法向当前的DE询问默认终端是什么。