C ++およびGTKMMライブラリを使用して、GTK +でアプリケーションを作成しています

エピグラフ



妻が、十分なデータがあれば、図の面積、周囲、その他のパラメーターを計算できる簡単な小さなプログラムを書くように私に頼んだら。 たとえば、三角形の領域が必要な場合、その辺が示されます。 側面を入力し、ボタンを押して領域を取得します。 または、側面と2つのコーナーのみが示されます。 一般的に、残りを計算するのに十分なデータ。

過去5年間、私はWeb開発者、主にPHPだけでしたが、もちろん時々rubyとperlで何かをする必要があることは注目に値します。 一般に、言語は私にとって問題ではありません。主なことは、コンピューター内のプロセスの意味を理解することです。その後、少なくともアセンブラー(Windowsのアプリケーションの逆アセンブルと小さなパッチ適用さえ行ったことがあります)。 それでも、デスクトップアプリケーションを作成したときは、もう覚えていません。 しかし、その後、妻がインターネットがなくても快適に使用できるように、デスクトップPCを作成することにしました。PHPを搭載したWebサーバーをラップトップに配置する必要はありませんでした。 さらに、私は長い間、C ++言語を使用してみました。 じゃあ 私の妻はLinux Ubuntuラップトップを使用しています。 グラフィックシステムは、Gnome3に基づくUnityです。 また、GnomeにはGTK +があります。

そのため、Gtk +を使用してLinux用のデスクトップアプリケーションを作成することが決定されました。 面白い? 猫へようこそ!



GTK +ライブラリを理解する



Linux上のほとんどのライブラリとアプリケーションは、手続き型アプローチを使用して実装されていることに注意してください。 私のオブジェクト指向の考え方は非常に深く根付いているので、OOPを完全に使用しなければ、私はひどく快適ではありません。 GTK +呼び出し関数をカスタムクラスにラップすることにしました。 もちろん、私は、C ++固有の構造を使用せずに、まったくプロフェッショナルではありませんでした。 言うまでもなく、Straustrupの読み取りは半分以下でした。私のOOP全体は、私がそれを使い始めた場所、つまりPHPからのものです。 glyいですが、うまくいきました。 要素の描画、ウィンドウの表示、イベントの処理が簡単になりました。 しかし、まだそうではありません。 この方法でアプリケーションを実装したので、私は1年間それを残しました。 凍った。 しかし、突然、GTKMMライブラリ(公式のC ++)に出会いました。GTK+ GUIライブラリのインターフェイスです。 そして、私はこの放棄されたアプリケーションを取り、それを変換し始めました。 もちろん、GTKMMクラスに置き換えたため、基本的な自己記述クラスを破棄しました。 親愛なる読者の皆さんと共有したいのは、この素晴らしい図書館を探索した私の経験です。 それでは始めましょう。

最初はアプリケーションのインターフェイスの作成を省略しますが、外観の作成(より正確には、コントロールをさらに復活させるためのフォーム上の場所)からであると思いますが、アプリケーションは最初のバージョンで作成およびレンダリングされたとすぐに謝罪します特定の関数を呼び出すことによって発生しました。 GtkBuilderを使用することになりましたが、それについては後で詳しく説明します。

エントリーポイント


C ++アプリケーションへのエントリポイントは、 main()



関数です。 アプリケーションでは、 GtkBuilder



ファイルからフォームをロードして表示し、アプリケーションのメッセージ処理サイクルを開始します。

アプリケーションを初期化する

 Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "org.apmpc.geometry");
      
      





次に、フォームを作成します

 builder = Gtk::Builder::create_from_file(UI_FILE);
      
      





フォームをクラス-ハンドラーにバインドします(クラスはGtk::Window



からの継承である独自のクラスを使用するため、 get_widget_derived



メソッドを使用します。

 builder->get_widget_derived("MainWindow", appwindow);
      
      





参考として、ハンドラーを関数として記述し、小さなアプリケーション、小さなフォーム、または宗教上の理由でクラスを作成したくない場合は、ドキュメントに示されているように、 Gtk::Window



クラスのオブジェクトを使用できます。この場合、 get_widget



メソッドが使用されます。

最後に、アプリケーションメッセージループを開始します

 return app->run(*appwindow);
      
      





アプリ


後半ですが、アプリケーションのコンポーネントについてもう少し詳しく説明します。 2つの形式で構成されています。 最初はメインウィンドウです。 図形のボタンがあります。



ボタンをクリックして、形状を選択します。 次に、2番目のフォームであるFigureウィンドウが開きます。



左側には値と結果の入力フィールドがあり、右側には選択した形状の図があります。 設計では、機能の拡張、形状の追加が考慮されたため、メインウィンドウの起動時に形状選択ボタンが作成されます。

MainWindowクラスは、メインフォームGtk::Window



から継承されGtk::Window



。 このクラスのコンストラクターでは、形状ボタンの作成が行われます。 ボタンポインターのリポジトリは、 m_pvShapeButtons



ベクトルです。

 m_pvShapeButtons.push_back(new Gtk::Button(CShape::getShapeName(i+1)));
      
      





クリックされたイベントの各ボタンは、 MainWindow::onShapeButtonClick(int iShape)



ハングしclicked





 m_pvShapeButtons.at(i)->signal_clicked().connect( sigc::bind<int> (sigc::mem_fun( *this, &MainWindow::onShapeButtonClick), (i+1) ) );
      
      





CShape



シェイプ処理クラスが1つCShape



ないため、シェイプインデックスをCShape



イベント処理メソッドに渡す必要があります。 CShape



クラスから継承された他の形状のクラスに関する情報が含まれています。 データを入力するためのフィールド、これらのフィールドの名前、計算用の式に関する情報が既にあります。

さて、ボタンをコンテナに取り付けて表示することを忘れないでください

 m_pShapeButtonBox->pack_end(*m_pvShapeButtons.at(i)); m_pvShapeButtons.at(i)->show();
      
      





ボタンをクリックすると、別のウィンドウが開きます。 インデックスによって、形状を決定し、データ入力用のフィールドを表示します。 入力フィールドは、3つの部分で構成されますGtk::Box



コンテナには、入力フィールドの名前とテキストフィールドGtk::Entry



を表示するGtk::Label



が含まれます。 これはすべて、 CEditBox



という名前の1つのクラスに結合することを決定しCEditBox



。 また、型変換を使用してデータを入出力するために必要なメソッドも含まれます。



ShapeWindowコンストラクCEditBox



で、選択した図形に必要な数のCEditBox



を作成します。 Gtk::DrawingArea



を継承CCanvas



クラスのオブジェクトがあるウィンドウの右側にシェイプを描画しましょう。 レンダリングはonDraw



イベントで発生します。 図に関する情報は、図クラスに含まれています。 drawクラスのdrawメソッドは、 CCanvas



クラスのCCanvas



を呼び出して、グラフィックプリミティブ(線、円、テキスト)を描画します。



おわりに



GTKMMを使用した最初のGTK +アプリケーションについて、そして実際にC ++で報告したいのはこれだけです。 すべてのコードはgithubにあります。 さらに、平行四辺形の面積の計算を実装し、debianパッケージを収集してppaに配置する機能を追加する予定です。 この記事に関するすべての質問とコメントにお答えできることを嬉しく思います。



UPD。 機能的アプローチを手続き型アプローチに修正しました。 最初に考えたように、機能がサブプログラムとして機能するのではなく、数学的な理解で計算される場合、機能的アプローチという用語が使用されます。 たとえば、機能的なアプローチを使用する言語:LISP、Erlang、Scala。 CおよびC ++は手続き型言語です。



All Articles