Показаны сообщения с ярлыком glade. Показать все сообщения
Показаны сообщения с ярлыком glade. Показать все сообщения

воскресенье, 23 октября 2011 г.

Создание простейшего приложения с графическим интерфейсом, используя Glade и gtkmm

Создание графического интерфейса с помощью Glade и gtk+ было рассмотрено в этом же блоге ранее. Вот ссылка. В данном посте заменим gtk+ на gtkmm.
Логика выполнения программы остается той же:
1)создается "xml-объект" (это чисто мой термин, возможно неудачный) из файла, созданного в интуитивно понятном графическом редакторе Glade;
2)из этого объекта "вытягиваются" имена элементов графического интерфейса, с которыми мы будем оперировать в коде;
3)из него же вытягиваем имена обработчиков сигналов для этих элементов и привязываем их каждого к своему элементу;
4)пишем код, реализующий эти обработчики;
Теперь все это в картинках:
Создаем главное окно приложения:

Придумываем ему какой-нибудь заголовок:

Создаем место для меню (в нашем случае оно и не надо для наших целей, но просто для красоты):

Добавляем это самое меню (красный кружок слева) и удаляем одно из мест для кнопок (красный кружок справа), так как у нас будет одна только кнопка, для выхода:

Добавляем в оставшееся место для кнопок кнопку из стандартного набора (это будет quit):

И добавляем обработчик сигнала (в нашем случае щелчок мыши) к созданной кнопке на вкладке Signals:

Сохраняем файл. Обратите внимание на File format в левом нижнем углу:

Теперь создаем файл hello.cpp:

Выделенные части должны иметь свои соответствия в предыдущих уже описанных нами действиях.
Компилируем:
$g++ hello.cpp `pkg-config gtkmm-2.4 libglademm-2.4 --cflags --libs`
и запускаем на выполнение:
$a.out
Должно получиться что-то вроде этого:

Все описанные действия выполнялись на Debian Squeeze.
Для облегчения изучения вот код не картинкой, а текстом:
#include <libglademm/xml.h>
#include <gtkmm.h> 
#include <iostream>
Gtk::Dialog* pDialog = 0;

void
button1_clicked_cb(){
 if(pDialog)
 pDialog->hide(); //hide() will cause main::run() to end.
}

int
main (int argc, char **argv){
 Gtk::Main kit(argc, argv);
 //Load the Glade file and instiate its widgets:
 Glib::RefPtr <Gnome::Glade::Xml>refXml;
 try{
      refXml = Gnome::Glade::Xml::create("hello.glade");
 }
 catch(const Gnome::Glade::XmlError& ex){
      std::cerr << ex.what() << std::endl;
      return 1;
 }
 //Get the Glade-instantiated Dialog:
 refXml->get_widget("dialog1", pDialog);
 if(pDialog){
      //Get the Glade-instantiated Button, and connect a signal handler:
      Gtk::Button* pButton = 0;
      refXml->get_widget("button1", pButton);
      if(pButton){
          pButton->signal_clicked().connect( sigc::ptr_fun(button1_clicked_cb) );
      }
      kit.run(*pDialog);
 }
 return 0;
}

Красивых интерфейсов вам.

среда, 2 февраля 2011 г.

Пример простейшего применения Glade для создания графического интерфейса приложения

При использовании Glade значительно сокращается объем кода. Код, который соответствует собственно описанию интерфейса, практически полностью "переезжает" в xml-файл, который можно "подсоединить" вызовом функции gtk_builder_add_from_file. Упомянутый xml-файл создается в Glade.
Здесь продемонстрируется минимальный код приложения, которое показывает в главном окне всего два виджета: GtkEntry и GtkLabel. При вводе некоего текста в GtkEntry этот текст будет отображаться в GtkLabel.
Создание соответствующего интерфейса в Glade тривиально и больших комментариев не требует. Запускаем Glade.

Оставляем как есть. Жмем Close.
Далее создаем окно приложения:

Добавляем в него вертикальный ящик с тремя ячейками:

Далее вставляем в эти ячейки наши GtkEntry и GtkLabel, а также кнопку выхода из приложения:


Для обработки сигнала clicked кнопки выхода выбираем стандартный gtk_main_quit. А для обработки сигнала changed (находим его в GtkEditable) выбираем любой предлагаемый вариант (не возбраняется и свой вариант набрать). Выберем on_entry1_changed. Не забываем потом написать код для этой функции.
А вот собственно код нашего приложения:

/*labelAndEntry.c*/
#include <gtk/gtk.h>

typedef struct _ddata ddata;
struct _ddata{
GtkWidget* window1;
GtkWidget* entry1;
GtkWidget* label1;
GtkWidget* button1;
} ;

ddata* myData;

int
main( int argc, char **argv )
{
GtkBuilder *builder;
GtkWidget *window;
GError *error = NULL;

/* инициализируем GTK+ */
gtk_init( &argc, &argv );

/* создаем новый объект типа GtkBuilder */
builder = gtk_builder_new();
/* загружаем пользовательский интерфес из файла, который мы создали в Glade */
if( ! gtk_builder_add_from_file( builder, "entryAndLabel.xml", &error ) )
{
g_warning( "%s", error->message );
g_free( error );
return( 1 );
}

myData = g_slice_new(ddata);
myData->window1 = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );
myData->entry1 = GTK_WIDGET( gtk_builder_get_object( builder, "entry1" ) );
myData->label1 = GTK_WIDGET( gtk_builder_get_object( builder, "label1" ) );
myData->button1 = GTK_WIDGET( gtk_builder_get_object( builder, "button1" ) );
/*
заметим, что имена полей структуры myData не обязаны совпадать со вторым аргументом функции gtk_builder_get object, они произвольны. Но этот второй аргумент должен совпадать с именем виджета, которое мы задали ему в окне "Doc Properties" Glade во вкладке General
*/
/* Get main window pointer from UI */
// window = GTK_WIDGET( gtk_builder_get_object( builder, "window1" ) );

/* "связываем" сигналы с объектами графического интерфейса */
// gtk_builder_connect_signals( builder, NULL );
gtk_builder_connect_signals( builder, myData );
/* разрушаем объект builder, так как он нам больше не нужен */
g_object_unref( G_OBJECT( builder ) );

/* даем команду показать главное окно приложения, а остальные виджеты отображаются объектом GtkBuilder */
gtk_widget_show( myData -> window1 );

/* стартуем */
gtk_main();
g_slice_free(ddata, myData);
return( 0 );
}
void
on_entry1_changed (GtkEditable *editable,
gpointer user_data) {
puts("changed!");
gtk_label_set_text(GTK_LABEL(myData->label1), gtk_entry_get_text(GTK_ENTRY(editable) ));
}
/*
имя этой функции должно совпадать с именем, которое мы дали обработчику соответствующего события (у нас - changed) в окне "Doc Properties" и вкладке Signals.
*/

Компилируем:
$ gcc -o labelAndEntry labelAndEntry.c $(pkg-config --cflags --libs gtk+-2.0 gmodule-2.0)
Запускаем на выполнение. Должно получиться следующее:

Если запустить наше прилодение из командной строки, то также при вводе какого-либо символа в GtkEntry, в консоли будет выводиться сообщение "changed!". При нажатии на кнопку будет осуществлен выход.
Все вышеописанное выполнялось в Debian squeeze.