単純なCLIで実行される組み込みLinux Cアプリケーションがあります。現在、コマンドラインプログラムと同じ機能を実行するGUIを作成する必要があります。私は熟練したGUIデザイナーではなく、私の経験が深く埋め込まれたCコーディングである場合は大多数です。
私の最初の考えは、qtcreatorを使用してGUIを作成することですが、いくつかの問題があります。
CLIアプリと同等のGUIをデザイン的に作成する方法について、大まかなガイドラインをいくつか示します。実際に電話をかける方法は、この回答の範囲外です。
注:入力検証はプロアクティブである必要があります、つまり、必須パラメーターが入力されていない場合に、実行ボタンをグレー表示し、通常はGUI要素をグレー表示またはアクティブにすることにより、ユーザーがアクションを実行できないようにする必要があります適切な使用法を伝えるため。 CLIアプリでは、ユーザーはコマンドを実行するだけでエラーメッセージが表示されます。つまり、検証はリアクティブです。
通常、これはコマンドラインを作成するというGUIフロントエンドを作成することで解決できます。その時点で、適切な順序で引数を指定して古いCLIの「main()」関数を呼び出すだけです。
その後、何をする必要があるかは、出力によって異なります。すべてのprintf()
を汎用出力可変関数でラップすることでうまくいくかもしれません。CLIバージョンでは、コントロールをprintf
に渡すだけですが、GUIバージョンでは、スクロールダウンログウィンドウに出力を送信します。そんな感じ。
このように、CLIアプリケーションはほとんど変更されず、GUIフロントエンドは効率が低下しますが、疎結合のままであり、独立して維持できます(場合によっては、モックアップまたは実際の代替 GUI-次に、独立したアプリケーションである可能性がありますspawns CLIバイナリと適切な引数; WindowsでAutoItを使用して実行できることの一種)。
しかし、これはアプリケーションが実際に何を行うかに大きく依存しますdoes。このアプローチは、多かれ少なかれ追求することができますが、たとえば、CLIルーチンサイクリックまたはそのようなものを実行したい場合、扱いにくくなる可能性があります。または、プログラムがstdin
からの入力を操作することを期待している場合。
最初に行うことは、バックエンド(現在のCLIの背後)をフロントエンド(CLI)から分離することです。
ビュー/コントローラー(CLI)をモデルから本質的に分離して、すべての機能コードを独自のスタンドアロンモジュールに分離できるようにする(たとえば、静的ライブラリにコンパイルできる)
次に、そのモジュールのパブリックCインターフェイスを使用して、QT GUIでコーディングできます。
ボタン押下の相関関係のために、QTには広範な信号スロット実装があり、QTクリエーターは多くのバインディングを処理します(右クリック->スロットに移動...->クリックされた()- >タイプfoo()
)
現在のCLIアプリケーションが合理的に構造化された入力および出力形式(特に出力。マシンで解析できるように十分に構造化されている必要があります)を使用している場合は、パイプを介してCLIアプリケーションと通信する別のGUIアプリケーションを常に作成できます。または一時ファイル。
GUIを現在のアプリケーションと統合するには、I/O処理をアプリケーションの他の部分から完全に分離できる必要があります。これにより、I/Oのない部分をライブラリとして構築し、ユーザーインターフェイスをボルトで固定できます(いずれか) GUIまたはCLI)に進みます。元のアプリケーションがこれ用に設計されていなかった場合、printf
呼び出しをあちこちに分散させるのが非常に簡単であるため、これは困難な作業になる可能性があります。
QtがC++であり、アプリケーションがCであるという事実は、バックエンド部分へのインターフェースがCとC++の共通のサブセットで記述されている限り、統合アプリケーションにとって大きな障害となることはありません。次に、C++の学習曲線を克服するだけです。