大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

AnjutaによるGtkプログラミング

株式会社クローバーフィールドの経営理念
著者:津路高広
公開日:2018/11/06
最終更新日:2018/11/06
カテゴリー:技術情報
タグ:

津路です。

Anjutaは、何度か取り上げていますが、今回もGtk素人として使ってみました。
widgetにハンドラを追加する手順を以下、記載します。

1.Anjutaにて新規プロジェクトを、Gtkを選んで作ります。
次に、src配下にある、uiを開くと、uiファイルが見えます。
中身は、UTF-8コードのxmlファイルです。
interfaceをトップレベルとし、ObjectとしてGtkWindowがデフォルトで配置されています。

2.ここに、ボタンを追加します。
AnjutaからはGUI編集できないので、Gladeを起動し、目的のuiを開きます。
ボタンを追加しましたら、次は、シグナルタブを、ボタンのプロパティウィンドウから選びます。
ここで、GtkButtonの行に、clickedという項目があります。
ハンドラーの名前に、bを入力すると、候補が表示され、button1_clicked_cbと表示されます。エンターで確定します。

ユーザーデータでは、ハンドラーに引き渡すオブジェクトを選択できます。
「交換」や「後で」というチェック項目もあります。
最右端のDアイコンをクリックすると、リファレンスマニュアルが起動して、この場合clicked signalの内容が表示されました。
リファレンスマニュアル

3.ハンドラの名前が決まったところで、次は、Anjutaに切り替え、
main.cにハンドラを記載します。リファレンスマニュアルに記載のとおりの関数定義をします。

void button1_clicked_cb(GtkButton *button, qpointer user_data)
{
}

関数にて、メッセージウィンドウをモーダルで起動したいとします。
gtk_message_dialog_newという関数で作成できるようです。

GtkWidget*w = gtk_message_dialog_new(button, GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTON_OK, "button clicked");

とし、これを表示するには、

gtk_dialog_run(GTK_DIALOG(w));

という変な名前の関数を使います。gtkでは、GTK_DIALOGなどとcastをしないとだめだそうです。
ですので、上記のダイアログを作成するときの第一引数は、コンパイルできるものの、castしないと駄目です。

更に、buttonを第一引数にすると、実行時に、wはnullとなります。ボタンもGtkWidgetなのですが、ここでは親ウィンドウが必要です。
トップレベルウィンドウを取得する関数が見つかりました。

GtkWidget *top = gtk_widget_get_toplevel(button);
w = gtk_message_dialog_new(GTK_WINDOW(top), ...);
gint ret = gtk_dialog_run(GTK_DIALOG(w)); //起動
//retに、ユーザが選択した結果が格納される
gtk_widget_destroy(w); //破棄

とすると、ダイアログが起動しました。

    上に戻る