Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2009, 15:33   #1
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию 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. Не пойму почему не работает. В атаче скрин.
Изображения
Тип файла: jpg Снимок.jpg (43.3 Кб, 168 просмотров)
heart вне форума Ответить с цитированием
Старый 29.11.2009, 16:56   #2
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

У меня для Вас большой совет - НЕ ИСПОЛЬЗУЙТЕ 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 нужна для того, что бы программа закрывалась после закрытия окна, в противном случае будет закрываться только окно, но приложение будет оставатся запущенным и висеть в памяти.

Результат:

Последний раз редактировалось oleg kutkov; 29.11.2009 в 17:02.
oleg kutkov вне форума Ответить с цитированием
Старый 29.11.2009, 17:13   #3
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

Спасибо огромное, попробую)))) спасибо за советы)))
heart вне форума Ответить с цитированием
Старый 30.11.2009, 14:20   #4
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

А еще такой вопрос, когда я создаю в glade форму. Бросаю на нее компонент, и он занимает все область формы, как сделать так чтобы можно было самому регулировать область объекта и его место положение на форме.
heart вне форума Ответить с цитированием
Старый 30.11.2009, 14:51   #5
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Цитата:
Сообщение от heart Посмотреть сообщение
А еще такой вопрос, когда я создаю в glade форму. Бросаю на нее компонент, и он занимает все область формы, как сделать так чтобы можно было самому регулировать область объекта и его место положение на форме.
Дело в том, что в Glade, да и Gtk+, нельзя произвольно распологать объекты в рамках окна, как, например, в Delphi. Все объекты находятся в определенной иерархии, а для их позиционирования используются объекты-контейнеры. В Glade они так и называются. Происходит разбиение плоскости окна на отдельные секторы, в которые можно помещатья другие виджеты или же другие контейнеры.
Уровень вложенности (дочерности) виджетов и контейнеров может быть большим, зависит от сложности интерфейса.
Это все отдельная большая тема... я бы написал ман, да и напишу, как нибудь, но пока что нет времени...
Могу посоветовать побродить по англоязычным ресурсам, посвященным Gtk+ и Glade, т.к. русскоязычной информации, увы, мало.
oleg kutkov вне форума Ответить с цитированием
Старый 30.11.2009, 16:36   #6
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

спасибо))) щас попробовал, разобрался, сейчас попробую напишу прогу простенькую.
heart вне форума Ответить с цитированием
Старый 01.12.2009, 20:26   #7
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

я, наверное, уже надоел, но еще такой вопрос возник:
Создаю обработчик события, все работает нормально, но как мне присвоить значение определенному свойству объекта, например, textview1, присвоить текст из переменной, или изменить название окна, или изменить размер кнопки.

Текст пробовал присвоить так:



Код:
void on_imagemenuitem2_activate (GtkObject *object, gpointer user_data)
{
char *text="user_text\0";
gtk_entry_set_text(GTK_ENTRY(user_data), text);
}
Не получается, также пробовал где данные пользователя вписывать textview1. Не получается

Последний раз редактировалось heart; 01.12.2009 в 21:40.
heart вне форума Ответить с цитированием
Старый 01.12.2009, 22:45   #8
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Я же, в примере выше, показал как:

Код:
GtkWidget	*label; 						//виджет, с которым мы свяжем label в окне, для управления им
.....
label =  GTK_WIDGET(gtk_builder_get_object(builder, "label"));		//связываем наш label с label из файла
gtk_label_set_label((GtkLabel*)label, "Привет!"); 			//задаем текст для метки
Т.е. в описании интерфейса у нас имеется виджет Label, который мы назвали label. Для работы с ним, мы создаем переменную *label, и связываем ее с виджетом в окне, а потом работаем уже с этой переменной-виджетом: задаем текст, читаем текст, меняем параметры.
Точно так же производится работа с любым другим виджетом, для textview1:
Код:
GtkTextBuffer *buffer;
buffer->set_text("Привет!");
GtkWidget	*textview;
textview =  GTK_WIDGET(gtk_builder_get_object(builder, "textview1"));
gtk_text_view_set_buffer (textview, buffer);
Ну и т.д. Подробнее о каждом виджете и функциях управлениями ими расписано в Devhelp.
oleg kutkov вне форума Ответить с цитированием
Старый 04.12.2009, 14:14   #9
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию блина ни чего не выходит...

Привет, не знаю, что делать. Выдает ошибки при компиляции, пробывал исправить и так и эдак.

Код:
[Kerny@localhost Рабочий стол]$ gcc primer.c -o primer -export-dynamic `pkg-config --cflags --libs gtk+-2.0`
primer.c: В функции ‘main’:
primer.c:7: ошибка: ‘GtkTextBuffer’ не содержит элемента с именем ‘set_text’
primer.c:20: предупреждение: в передаче аргумента 1 ‘gtk_text_view_set_buffer’: несовместимый тип указателя
/usr/include/gtk-2.0/gtk/gtktextview.h:220: замечание: expected ‘struct GtkTextView *’ but argument is of type ‘struct GtkWidget *’
Вот код приложения:
Код:
#include <gtk/gtk.h>


int main (int argc, char **argv)
{
	GtkTextBuffer *buffer;
	buffer->set_text("Привет!");
	GtkBuilder  *builder; 
	GtkWidget	*textview;						
	GtkWidget   *mainwindow;						//виджет - окно 
	

	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, "window1")); 	//связываем наше окно с окном из файла
	textview =  GTK_WIDGET(gtk_builder_get_object(builder, "textview1"));
	gtk_builder_connect_signals (builder, NULL);				
	
	gtk_text_view_set_buffer (textview, buffer);
	gtk_widget_show (mainwindow);     					//показываем окно
    	gtk_main();								//запускаем главный цикл приложения
    	return 0;
}
А вот код xml файла, во вложение.

Очень прошу помочь, хочу в этом всем разобраться.
Вложения
Тип файла: zip primer.xml.zip (1.1 Кб, 13 просмотров)
heart вне форума Ответить с цитированием
Старый 04.12.2009, 14:46   #10
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Не вижу никакой проблемы. Компилятор явно говорит, что не так. Допускаю, что я мог ошибится в названии метода set_text, т.к. писал по памяти, практически...
Просто почитайте Devhelp, там про все методы все написано, разобраться не сложно, когда мне нужно это все было - освоил за пару дней...
oleg kutkov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кроссплатформенный анимированный осциллограф (GTK+, Cairo) oleg kutkov Qt и кроссплатформенное программирование С/С++ 15 22.10.2015 20:13
обновление в блоге - Кроссплатформенный анимированный осциллограф (GTK+, Cairo) Pblog Обсуждение статей 0 16.08.2009 16:00