私は GTK+ GUI を作成していますが、GtkBuilder を使用してそれを実行しようとしています。
ノートブック、メニュー、2 つのボタンがあるメイン ウィンドウがあります。ボタンをクリックすると、ノートブックにタブが表示されます。
そこで、GtkBuilder を使用してファイルからメイン ウィンドウを作成し、各タブをビルダーに追加しようとしました。
今のところ、これを行いました(インデントされていないコードはデバッグ出力です):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <gtk/gtk.h>
#include "main.h"
GtkBuilder* build;
int i;
#define TAB\
"<interface>\
<object class=\"GtkNotebook\" id=\"note\">\
<property name=\"scrollable\">t</property>\
<property name=\"show-border\">t</property>\
<property name=\"show-tabs\">t</property>\
<child>\
<object class=\"GtkLabel\" id=\"tab%d\">\
<property name=\"label\">Content%d</property>\
</object>\
</child>\
<child type=\"tab\">\
<object class=\"GtkLabel\" id=\"labTab%d\">\
<property name=\"label\">Label%d</property>\
</object>\
</child>\
</object>\
</interface>"
int main(int argc, char** argv) {
GtkWidget* window;
// GtkWidget* item;
GError* error=NULL;
GtkAccelGroup* accel_group;
i=0;
gtk_init(&argc, &argv);
build=gtk_builder_new();
if (gtk_builder_add_from_file(build, "gui.ui", &error)==0)
printf("erreur %s\n", error->message);
gtk_builder_add_callback_symbol(build, "quit", func);
gtk_builder_add_callback_symbol(build, "add", add);
gtk_builder_connect_signals(build, NULL);
window=(GtkWidget*)gtk_builder_get_object(build, "main");
gtk_window_maximize(GTK_WINDOW(window));
gtk_widget_show_all(window);
gtk_main();
return EXIT_SUCCESS;
}
void add() {
char* str;
GtkWidget* window;
GError* error=NULL;
FILE* file=NULL;
printf("in add 1\n");
if ((str=malloc(sizeof(TAB)+20))==NULL) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("in add 2\n");
snprintf(str, sizeof(TAB)+20, TAB, i, i, i, i);
printf("in add 3, str : %s\n", str);
if ((file=fopen("tmp.ui", "w"))==NULL) {
free(str);
perror("fopen");
exit(EXIT_FAILURE);
}
fprintf(file, TAB, i, i, i, i);
fclose(file);
/* if (gtk_builder_add_from_file(build, "tmp.ui", &error)==0)
printf("erreur %s\n", error->message);*/
if (gtk_builder_add_from_string(build, str, sizeof(str), &error)==0)
printf("erreur %s\n", error->message);
printf("in add 4\n");
if ((window=(GtkWidget*)gtk_builder_get_object(build, "main"))==NULL)
printf("Can't find\n");
else
gtk_widget_show_all(window);
sprintf(str, "tab%d", i);
if ((window=(GtkWidget*)gtk_builder_get_object(build, str))==NULL)
printf("in add, Does not exist (%s)\n", str);
else
printf("in add, Exist (%s)\n", str);
remove("tmp.ui");
free(str);
++i;
// free(error);
}
これが私のビルダー定義です:
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- Main window -->
<object class="GtkWindow" id="main">
<property name="title">Test Xml</property>
<property name="window-position">GTK_WIN_POS_CENTER</property>
<property name="default-width">1024</property>
<property name="default-height">512</property>
<signal name="delete-event" handler="quit"/>
<child>
<object class="GtkBox" id="mainBox">
<property name="orientation">GTK_ORIENTATION_VERTICAL</property>
<property name="spacing">5</property>
<!-- Menu -->
<child>
<object class="GtkMenuBar" id="menuBar">
<child>
<!-- Menu fichier -->
<object class="GtkMenuItem" id="m1">
<property name="label">_Fichier</property>
<property name="use_underline">True</property>
<child type="submenu">
<object class="GtkMenu" id="menu">
<property name="accel-group">accel_group</property>
<child>
<!-- Item Quitter -->
<object class="GtkMenuItem" id="i1">
<property name="accel-path"><Test>/FILE/QUIT</property>
<property name="label">_Quitter</property>
<property name="use_underline">True</property>
<signal name="activate" handler="quit"/>
</object>
<!-- End Item Quitter -->
</child>
</object>
</child>
</object>
<!-- End Menu fichier -->
</child>
</object>
</child>
<!-- End Menu -->
<!-- Frame -->
<child>
<object class="GtkFrame" id="mainframe">
<property name="expand">t</property>
<!-- Note book -->
<child>
<object class="GtkNotebook" id="note">
<property name="scrollable">t</property>
<property name="show-border">t</property>
<property name="show-tabs">t</property>
</object>
</child>
<!-- Note book -->
</object>
</child>
<!-- End Frame -->
<!-- Bottom box -->
<child>
<object class="GtkBox" id="bottomBox">
<property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
<property name="spacing">5</property>
<!-- Buttons -->
<child>
<object class="GtkButton" id="boutonPlus">
<property name="label">_Ajouter</property>
<property name="use-underline">t</property>
<signal name="activate" handler="add"/>
</object>
</child>
<child>
<object class="GtkButton" id="boutonMoins">
<property name="label">_Enlever</property>
<property name="use-underline">t</property>
</object>
</child>
<!-- End buttons -->
</object>
</child>
<!-- End Bottom box -->
</object>
</child>
</object>
</interface>
出力は次のとおりです。
in add 1
in add 2
in add 3, str : <interface>
<object class="GtkNotebook" id="note">
<property name="scrollable">t</property>
<property name="show-border">t</property>
<property name="show-tabs">t</property>
<child>
<object class="GtkLabel" id="tab0">
<property name="label">Content0</property>
</object>
</child>
<child type="tab">
<object class="GtkLabel" id="labTab0">
<property name="label">Label0</property>
</object>
</child>
</object>
</interface>
in add 4
in add, Does not exist (tab0)
ご覧のとおり、タブはビルダーに追加されていませんが、追加するとエラーは発生しないようです。
- ドキュメントには、いくつかの ui 定義をマージしたい場合は、 を使用
gtk_builder_new()
し、次に を使用する必要があると書かれていますgtk_builder_add_from_...()
。だから私はそれをしました、そして私のadd
関数では、文字列またはファイルからタブを追加しようとしました. - ドキュメントでは、マージを行うために必要なものについて何も見つかりませんでした。そこで、タブを追加するために
<interface>
、ノードブック定義の有無にかかわらず試してみました。しかし、何も変わりませんでした。
UI定義を とマージすることに関するドキュメントはありますかGtkBulder
、または誰かが私が間違っていることを説明してくれますか?