4

シェルを使用して、または GUI から実行すると、動作が異なるクラスを構築しようとしています。

#include "myclass.h" を使用して両方の形式に含めることができます...

ただし、コンストラクターでは、シェルの実行と GUI の実行を区別したいと思います。

宣言時にコンストラクターに渡されるパラメーターを使用して簡単に実現できますが、オプションを検討したいと思います。

ubuntu で C++ を使用しており、GUI では Qt を使用しています。

4

2 に答える 2

8

X ウィンドウが存在するかどうかを判断する標準的な C の方法:

#include <stdlib.h>

if (NULL == getenv("DISPLAY")) is_gui_present = false;
else is_gui_present = true;
  • これにより、端末エミュレーターと純粋な tty 起動で疑似端末を区別できます。

シェルが存在するかどうか、またはアプリケーションがファイルマネージャーなどから実行されたかどうかを判断したい場合は、簡単ではありません。どちらの場合もexec、シェルまたはファイルマネージャー/GUI プログラムランナーからのシステムコールの呼び出しにすぎません。 (多くの場合、同じパラメーターを使用します)、それを確認するには明示的にフラグを渡す必要があります。

PS私はそれを行う方法を見つけました:変数「TERM」の環境を確認してください-シェル用に設定され、Qtプログラムに継承されますが、GUIプログラムでは設定されないことがよくあります。しかし、これを正確な解決策と見なさないでください。

于 2012-11-02T23:06:00.420 に答える
6

デスクトップ (ダブルクリックまたはデスクトップ ファイル/スタート メニュー) からプログラムを起動すると、通常、stdin ファイル記述子がパイプにリダイレクトされます。これを検出できます:

#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
于 2012-11-02T23:23:25.693 に答える