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

标签 linux qt qprocess

我使用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,而且许多人甚至没有安装它。

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

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

相关文章:

qt - 自动化自定义 QTranslator 上下文

c++ - 与 QProcess 交互的问题

mysql - mysql 的 crontab 行为差异

android - 我可以在 android 中使用 Linux 系统调用吗?

linux - 如何像在 cmake 中一样创建 linux 内核的 .config

c++ - 发送一系列命令并等待响应

linux - 从 eclipse 将更改提交到 cvs

c++ - Qt如何在QTableView中选择鼠标下的单词

c++ - Qt - 如何将 QProcess 的标准输出重定向到 TextEdit

c++ - 重用 QProcess 对象 (Qt 4.8)