Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   gtk, glade, c (https://forum.antichat.xyz/showthread.php?t=159989)

Kerny 29.11.2009 17:16

gtk, glade, c
 
Создаю в glade интерфейс для проги, вот файл интерфейса:
Код:

<?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>

Пишу код на си:
Код:

#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;
}

Компилирую:
Код:

gcc primer.c -o primer `pkg-config --cflags --libs libglade-2.0`
Компится без ошибок.
запускаю:
./primer

Ничего в консоле нету и прога не запускается. Все это дело естественно под Linux. Не пойму почему не работает.
Скрин:
http://img7.imageshost.ru/imgs/09112...408/taede8.png

Kerny 30.11.2009 15:15

Помогли на другом форуме, кому интересно:

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

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

Код:

#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):


Код:

<?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")

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

Код:

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

nerezus 30.11.2009 20:24

Как по мне - то писать прикладнуху на сишнике - еще то извращение.


Время: 07:20