【问题标题】:how to find out if running from terminal or GUI如何确定是从终端还是 GUI 运行
【发布时间】:2012-10-23 15:21:51
【问题描述】:

我正在尝试构建一个类,如果使用 shell 或 GUI 运行,其行为方式会有所不同。

可以使用#include "myclass.h" 将其包含在两种形式中...

但是,在构造函数中,我想区分 Shell 运行和 GUI 运行。

我可以使用在声明它时传递给构造函数的参数轻松实现它,但我想探索我的选择。

我在 ubuntu 上使用 C++,而我的 GUI 使用 Qt。

【问题讨论】:

  • 嗯,这是扭曲的......我能问你为什么吗?通常认为“核心”模块对使用它们的视图视而不见是一种很好的做法。
  • 我对此并不完全确定,但您可以尝试将 qApp macro 动态转换为 QApplication。如果它是一个 GUI 程序,你应该获得成功的演员表。否则它是一个 QCoreApplication 指针。
  • xterm 是终端还是 GUI?
  • 弗拉德:我想要自动检测。我指定如果找不到任何自动方式,我可以手动完成。 @georgesl:您在 GUI 中有更多选项,例如你喜欢的外壳颜色。最好利用这些功能
  • 这对我来说听起来像是一种代码味道。除了应用程序的前端之外,您的核心类不需要知道正在使用什么前端(如果有的话!)。

标签: c++ linux qt shell ubuntu


【解决方案1】:

判断 X Window 是否存在的标准 C 方法:

#include <stdlib.h>

if (NULL == getenv("DISPLAY")) is_gui_present = false;
else is_gui_present = true;
  • 这允许区分终端模拟器和纯 tty 启动中的伪终端。

如果你想确定是否有 shell,或者应用程序是从文件管理器运行的,那么这并不容易:这两种情况都只是从 shell 调用 exec 系统调用或文件管理器/GUI 程序运行器(通常具有相同的参数),您需要显式传递一个标志才能看到。

附:我刚刚找到了一种方法:检查变量“TERM”的环境 - 它是为 shell 设置的,并且被继承到 Qt 程序,它通常不在 GUI 程序中设置。但是不要把它当作一个准确的解决方案!

【讨论】:

  • 我不认为这是 OPS 的要求。据我了解,他想知道该程序是否是通过 GUI 启动的(比如双击它),而不是从 CLI 启动。
  • @NikosC。有些人会在寻找这个解决方案的同时到达这里,我也 +1
【解决方案2】:

从桌面启动程序(双击或从桌面文件/开始菜单)通常会将其标准输入文件描述符重定向到管道。您可以检测到这一点:

#include <cstdio>    // fileno()
#include <unistd.h>  // isatty()

if (isatty(fileno(stdin)))
    // We were launched from the command line.
else
    // We were launched from inside the desktop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多