web-dev-qa-db-ja.com

GUIをコマンドラインアプリに追加するための標準的な設計方法は何ですか?

単純なCLIで実行される組み込みLinux Cアプリケーションがあります。現在、コマンドラインプログラムと同じ機能を実行するGUIを作成する必要があります。私は熟練したGUIデザイナーではなく、私の経験が深く埋め込まれたCコーディングである場合は大多数です。

私の最初の考えは、qtcreatorを使用してGUIを作成することですが、いくつかの問題があります。

  • 今後は、CLプログラムとGUIプログラムの両方を維持したいと思います。できれば、どちらのモードでも起動できるまったく同じ実行可能ファイルにすることもできます。これが悪い考えでない限り?
  • 私のコードはこれまでのところCにあり、qtはネイティブにC++です
  • GUIでボタンを押すと、CLIから呼び出すのと同じ関数を呼び出す直接相関関係が欲しい
  • これをクリーンかつ効率的に行うにはどうすればよいですか?これを簡単にする他の技術やライブラリはありますか?もっと良いものがあればqtを使う必要はありません。
8
Brandon Yates

CLIアプリと同等のGUIをデザイン的に作成する方法について、大まかなガイドラインをいくつか示します。実際に電話をかける方法は、この回答の範囲外です。

  • -p -vなどのスイッチはチェックボックスです

enter image description here

  • 相互に排他的なオプションはラジオボタンのグループです

enter image description here

  • ファイル名であるパラメータは、押されたときにファイルの選択ダイアログボックスを表示する「選択」ボタン付きのテキストボックスです。

enter image description here

  • 一般に文字列パラメータはテキストボックスです
  • 数値パラメーターは、既知の値に応じて、テキストボックス、コンボボックス、またはスピンボックスになり、範囲または自由形式に制限されます。

enter image description here

enter image description here

  • 完全に異なる使用法がタブページに分かれています(たとえば、メタスイッチの「コミット」をgitに追加し、予想される/許可されるスイッチとパラメーターのセット全体を変更します)

enter image description here

  • パラメータを入力すると、ボタンがアクションを実行します

enter image description here

注:入力検証はプロアクティブである必要があります、つまり、必須パラメーターが入力されていない場合に、実行ボタンをグレー表示し、通常はGUI要素をグレー表示またはアクティブにすることにより、ユーザーがアクションを実行できないようにする必要があります適切な使用法を伝えるため。 CLIアプリでは、ユーザーはコマンドを実行するだけでエラーメッセージが表示されます。つまり、検証はリアクティブです。

11

通常、これはコマンドラインを作成するというGUIフロントエンドを作成することで解決できます。その時点で、適切な順序で引数を指定して古いCLIの「main()」関数を呼び出すだけです。

その後、何をする必要があるかは、出力によって異なります。すべてのprintf()を汎用出力可変関数でラップすることでうまくいくかもしれません。CLIバージョンでは、コントロールをprintfに渡すだけですが、GUIバージョンでは、スクロールダウンログウィンドウに出力を送信します。そんな感じ。

このように、CLIアプリケーションはほとんど変更されず、GUIフロントエンドは効率が低下しますが、疎結合のままであり、独立して維持できます(場合によっては、モックアップまたは実際の代替 GUI-次に、独立したアプリケーションである可能性がありますspawns CLIバイナリと適切な引数; WindowsでAutoItを使用して実行できることの一種)。

しかし、これはアプリケーションが実際に何を行うかに大きく依存しますdoes。このアプローチは、多かれ少なかれ追求することができますが、たとえば、CLIルーチンサイクリックまたはそのようなものを実行したい場合、扱いにくくなる可能性があります。または、プログラムがstdinからの入力を操作することを期待している場合。

6
LSerni

最初に行うことは、バックエンド(現在のCLIの背後)をフロントエンド(CLI)から分離することです。

ビュー/コントローラー(CLI)をモデルから本質的に分離して、すべての機能コードを独自のスタンドアロンモジュールに分離できるようにする(たとえば、静的ライブラリにコンパイルできる)

次に、そのモジュールのパブリックCインターフェイスを使用して、QT GUIでコーディングできます。

ボタン押下の相関関係のために、QTには広範な信号スロット実装があり、QTクリエーターは多くのバインディングを処理します(右クリック->スロットに移動...->クリックされた()- >タイプfoo()

3
ratchet freak

現在のCLIアプリケーションが合理的に構造化された入力および出力形式(特に出力。マシンで解析できるように十分に構造化されている必要があります)を使用している場合は、パイプを介してCLIアプリケーションと通信する別のGUIアプリケーションを常に作成できます。または一時ファイル。

GUIを現在のアプリケーションと統合するには、I/O処理をアプリケーションの他の部分から完全に分離できる必要があります。これにより、I/Oのない部分をライブラリとして構築し、ユーザーインターフェイスをボルトで固定できます(いずれか) GUIまたはCLI)に進みます。元のアプリケーションがこれ用に設計されていなかった場合、printf呼び出しをあちこちに分散させるのが非常に簡単であるため、これは困難な作業になる可能性があります。

QtがC++であり、アプリケーションがCであるという事実は、バックエンド部分へのインターフェースがCとC++の共通のサブセットで記述されている限り、統合アプリケーションにとって大きな障害となることはありません。次に、C++の学習曲線を克服するだけです。