GUIをコマンドラインアプリに追加するためのいくつかの標準的な設計方法は何ですか?[閉まっている]


8

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

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

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

レイテンシ要件がある場合は、その要件にかなり依存します。シンプルなGUIの場合、スクリプト言語(Yad / Zenity / GTKdialog / TclTk / ... et cetera et cetera)を使用して、ルックアンドフィールをすばやくプロトタイプ化できます。通常、GUIとコード間の1対1の対応を回避する必要があります。アイデアは、ユーザーにアプリケーションの内部を学習させるのではなく、インターフェースを使いやすく直感的にすることです。
ディアハンター

この記事objectmentor.com/resources/articles/TheHumbleDialogBox.pdfは、おそらくあなたを助けるでしょう-「モデルビュープレゼンター」について説明します。これは、ユーザーインターフェースを交換可能にするために知っている最良のアプローチです。
Doc Brown

回答:


11

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

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

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


1
とても良いアドバイスです。それ自体は答えではありませんが、他の「何をすべきか」の答えを補足する素晴らしい「方法」です。
ボブソン2013

6

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

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

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

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


興味深いアイデアですが、両方の場所から同じメソッドを呼び出すだけではなく、コマンドライン引数を作成することの利点は実際にはわかりません。さらに、GUIプログラムの存続期間中にmainを数回呼び出す可能性があるのは奇妙に思われます。
jhewlett 2013

1
これを行わないと、コマンドラインからは実行できないことをGUIが実行できるというリスクが生じます。
Pieter B

1
@jhewlett、これは確かにショートカットです。main()それ自体、「実際の」プログラム本体への引数を解析するフロントエンドにすぎません。しかし、それが事実であったなら、私はあなたのオプション(これが最良のオプション)を採用することは、そもそも質問を正当化しないほど簡単だったと思います。
LSerni 2013

3

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

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

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

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


1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.