gtk, glade, c

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Kerny, 29 Nov 2009.

  1. Kerny

    Kerny Member

    Joined:
    18 Nov 2009
    Messages:
    37
    Likes Received:
    9
    Reputations:
    1
    Создаю в glade интерфейс для проги, вот файл интерфейса:
    Code:
    <?xml version="1.0"?>
    <glade-interface>
      <!-- interface-requires gtk+ 2.16 -->
      <!-- interface-naming-policy project-wide -->
      <widget class="GtkWindow" id="window1">
        <child>
          <widget class="GtkLabel" id="label1">
            <property name="visible">True</property>
            <property name="label" translatable="yes">label</property>
          </widget>
        </child>
      </widget>
    </glade-interface>
    
    Пишу код на си:
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <glade/glade.h>
    
    int main (int argc, char **argv)
    {
       GladeXML *xml;
        gtk_init(&argc, &argv);
        glade_init();
        xml = glade_xml_new("primer.glade", "window1", NULL);
        if (!xml) {
    	g_warning("Failed to create the interface");
    	return 1;
        }
        gtk_main();
        return 0;
    }
    
    Компилирую:
    Code:
    gcc primer.c -o primer `pkg-config --cflags --libs libglade-2.0`
    Компится без ошибок.
    запускаю:
    ./primer

    Ничего в консоле нету и прога не запускается. Все это дело естественно под Linux. Не пойму почему не работает.
    Скрин:
    [​IMG]
     
  2. Kerny

    Kerny Member

    Joined:
    18 Nov 2009
    Messages:
    37
    Likes Received:
    9
    Reputations:
    1
    Помогли на другом форуме, кому интересно:

    У меня для Вас большой совет - НЕ ИСПОЛЬЗУЙТЕ LIBGLADE в своих проектах (даже учебных).
    Для этого есть несколько причин:
    1. Использование libglade создает лишнюю привязку к этой библиотеке, а она может быть не установлена на другой машине (в отличие от gtk+)
    2. Основное назначение этой библиотеки - работа в самой среде Glade.
    3. Так советуют сами разроботчики Glade и Gtk+

    Но это не означает, что вы теряете возможность использование Glade xml для построения интерфейса. В Gtk+, начиная с версии 2.12, имеется особый компонент - GtkBuilder, используйте его. В примере, ниже, я покажу, как именно:

    Code:
    #include <gtk/gtk.h>
    
    int main (int argc, char **argv)
    {
    	GtkBuilder  *builder; 							//объект, с помощью которого будет построен интерфейс пользователя
    	GtkWidget   *mainwindow;						//виджет - окно 
    	GtkWidget	*label; 						//виджет, с которым мы свяжем label в окне, для управления им
    	gtk_init(&argc, &argv);							//инициализируем gtk
    	builder = gtk_builder_new ();						//создаем новый GtkBuilder объект
        	gtk_builder_add_from_file(builder, "primer.xml", NULL);			//загружаем описание интерфейса из XML файла
    	mainwindow = GTK_WIDGET(gtk_builder_get_object(builder, "mainwindow")); //связываем наше окно с окном из файла
    	label =  GTK_WIDGET(gtk_builder_get_object(builder, "label"));		//связываем наш label с label из файла
    	gtk_builder_connect_signals (builder, NULL);				//подключаем сигналы
    	gtk_label_set_label((GtkLabel*)label, "Привет!"); 			//задаем текст для метки
    	gtk_widget_show (mainwindow);     					//показываем окно
        	gtk_main();								//запускаем главный цикл приложения
        	return 0;
    }
    
    void on_mainwindow_destroy (GtkObject *object, gpointer user_data)		//обработчик сигнала закрытия главного окна
    {
        gtk_main_quit ();	//выйти из главного цикла
    }
    
    Собственно, немного изменяется и содержимое файла-описания (я его, как видите, назвал primer.xml):


    Code:
    <?xml version="1.0"?>
    <interface>
      <requires lib="gtk+" version="2.16"/>
      <!-- interface-naming-policy project-wide -->
      <object class="GtkWindow" id="mainwindow">
        <property name="window_position">center</property>
        <property name="default_width">400</property>
        <property name="default_height">300</property>
        <signal name="destroy" handler="on_mainwindow_destroy"/>
        <child>
          <object class="GtkLabel" id="label">
            <property name="visible">True</property>
            <property name="label" translatable="yes">label</property>
          </object>
        </child>
      </object>
    </interface>
    Теперь, при создании нового проекта в Glade, выбирайте формат проекта GtkBuilder и сохраняйте как "файлы GtkBuilder")

    Для компиляции используйте команду:

    Code:
    gcc primer.c -o primer -export-dynamic `pkg-config --cflags --libs gtk+-2.0`
    Опция export-dynamic означает, что производится динамическое связывание сигналов объектов и обработчиков сигналов.
    Функция on_mainwindow_destroy нужна для того, что бы программа закрывалась после закрытия окна, в противном случае будет закрываться только окно, но приложение будет оставатся запущенным и висеть в памяти.
     
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    727
    Reputations:
    266
    Как по мне - то писать прикладнуху на сишнике - еще то извращение.