我使用QProcess
打开控制台窗口,但没有显示窗口。
QProcess *process = new QProcess();
process->startDetached(command);
我想打开一个窗口来启动文本模式命令,例如adb -s xxxxx shell
打开 shell 窗口来访问 Android 设备。
我找到了关键字CREATE_NEW_CONSOLE
,但我不知道如何使用它。
最佳答案
在 Windows 上,控制台和 GUI 可执行文件在可执行格式级别上存在区别;当控制台可执行文件启动时,操作系统本身要么回收当前控制台(如果父进程本身已经存在于控制台中),要么为新启动的进程分配一个新控制台。
相反,在 Linux 上,没有这样的区别;系统对终端模拟器(它们是常规应用程序)一无所知,并且当启动可执行文件时,它会从父级继承控制终端(尽管有系统调用可能会影响这一点),将 stdin/stdout/stderr 附加到它(再次,除非执行重定向)并开始执行其操作。 GUI 程序只是不期望通过终端进行交互并“碰巧”与 X(或 Wayland)服务器对话的程序,但同样,系统无法知道这一点,这都是惯例。
解决您的问题:当您从“GUI”应用程序通过QProcess
直接启动adb
时,子进程会继承您的应用程序拥有的任何控制终端;因此,如果您的程序是通过 Qt 创建者启动的,您将在“应用程序输出” Pane 中看到其输出,当您从控制台启动它时,您将能够通过它与 adb
交互,等等。
如果您想在单独的终端中打开 adb
,则必须显式启动终端模拟器,并依次告诉它调用 adb
;一旦您知道要启动的终端模拟器是什么,这通常很简单,因为任何值得使用的终端模拟器都将接受 -e program_name argument
选项(模仿 xterm
)。
然而,我们处于一个悲伤的境地,因为在典型的 Linux 方式中,没有标准的、与桌面无关的方法来知道什么是“默认”终端模拟器,即使几乎每个 DE/面板/任何东西都有这个设置。
寻找这种与桌面无关的东西的地方通常是 freedesktop.org(以前称为 X Desktop Group,因此你会在他们的大部分东西中看到缩写 XDG),其中有 a still unresolved bug from 2015关于此类问题1。您可以在this mailing list thread中看到人们曾考虑过修复它的方法,但据我所知,它刚刚消失了。
所以,我认为你有两个选择:
只需启动
xterm
;它不是特别漂亮,但是没有它就没有图形化的 Linux 安装(即使它不是“真正的”xterm,也会有一个恰当命名的符号链接(symbolic link)),所以您确信它会工作。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
,而且许多人甚至没有安装它。
- 这个问题特别是关于“当遇到
.desktop
(=launcher) 文件时,xdg-open
应该做什么,这些文件说“这个程序必须在单独的控制台中运行”,这几乎就是您要解决的问题。如上所述,几乎所有 DE 都遵循此标志,但与桌面无关的xdg-open
不能,因为无法询问当前 DE 的默认终端是什么。
关于linux - 如何在 Qt 中的 Linux 下打开启动进程的控制台窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623078/