我使用QProcess
打开控制台窗口但没有显示窗口。
QProcess *process = new QProcess();
process->startDetached(command);
我想打开一个窗口来启动文本模式命令,例如adb -s xxxxx shell
打开一个shell窗口来访问Android设备。
我找到了关键字CREATE_NEW_CONSOLE
但我不知道使用它。
答案 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”应用程序直接adb
到QProcess
时,子进程会继承您的应用程序所具有的任何控制终端;所以,如果您的程序是通过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
,而且许多人甚至没有安装它。
xdg-open
(=启动器)文件时应该.desktop
应该做什么,这些文件说”这个程序必须在一个单独的控制台中运行“,这几乎就是你正试图解决的问题。如上所述,几乎任何DE都尊重这个标志,但桌面无关xdg-open
不能,因为没有办法向当前的DE询问默认终端是什么。