我使用QProcess打开控制台窗口,但未显示任何窗口。

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


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

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

最佳答案

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

相反,在Linux上,没有这种区别。系统对终端仿真器(常规应用程序)一无所知,并且当可执行文件启动时,它会从父级继承控制终端(尽管有可能影响此功能的系统调用),并附加了stdin / stdout / stderr到它(再次,除非执行重定向),然后去做它的东西。 GUI程序只是不希望通过终端和“ happen”与X(或Wayland)服务器进行交互的程序,但同样,系统也无从得知,这完全是惯例。

要解决您的问题:当您从“ GUI”应用程序中直接通过adb开始QProcess时,子进程将继承应用程序具有的所有控制终端;因此,如果您的程序是通过Qt创建者启动的,则您将在“应用程序输出”窗格中看到其输出,当您从控制台启动它时,您将能够通过它与adb进行交互,依此类推。

如果要在单独的终端中打开adb,则必须显式启动终端仿真器,依次告诉它调用adb;一旦知道了要启动的终端仿真器,这通常很简单,因为任何值得使用的终端仿真器都会接受-e program_name arguments选项(模仿xterm)。

但是,我们处于一种悲惨的境地,因为在典型的Linux方式中,没有标准的,与桌面无关的方法来知道什么是“默认”终端仿真器,即使几乎每个DE / panel /任何地方都具有此设置。

寻找这类与桌面无关的东西的地方通常是freedesktop.org(以前称为X Desktop Group,因此在大多数东西中都会看到缩写XDG),其中包含关于这类内容的a still unresolved bug from 2015问题1。您可以在this mailing list thread中看到解决该问题的方法,但是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,甚至很多人都没有安装它。




该问题尤其与“遇到xdg-open(= launcher)文件时说“该程序必须在单独的控制台中运行”时.desktop应该做什么”有关,这几乎就是您要解决的问题。如上所述,几乎所有DE都接受此标志,但是与桌面无关的xdg-open不能,因为无法向当前DE询问默认终端是什么。

关于linux - 如何在Qt中的Linux下打开启动过程的控制台窗口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50623078/

10-11 23:07
查看更多