The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Ошибка при запуске простой программы на GTK+ "
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Ошибка при запуске простой программы на GTK+ "  +/
Сообщение от Mihon79 (ok) on 09-Фев-13, 12:08 
Привет всем!

Пару дней назад начал постигать азы программирования на С++ под Ubuntu.

И всё было у меня хорошо, пока не попытался разместить кнопку в определённом месте окна.
После компиляции при запуске программы у меня начала выводиться следующая ошибка:
Program Received signal SIGSEGV
Stack trace is available in the 'Call Stack' tab.

Вот листинг:

#include <gtkmm.h>

int
main (int argc, char **argv)
{
  /* Инициализируем поддержку i18n */
//  gtk_set_locale ();

  gtk_init (&argc, &argv);

  /* Список виджетов, используемых в окне */

GtkWidget* mainwin ;
GtkWidget* buttonok ;
GtkWidget* buttoncont ;
int x,y;
x = 10;
y = 10;
/* Инициализация главного окна и передача ему необходимых параметров*/

mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_title (GTK_WINDOW(mainwin),"Cистема настройки параметров linux");
gtk_window_maximize (GTK_WINDOW (mainwin));

/* Инициализация виджетов главного окна*/

buttonok = gtk_button_new_with_label("Добавить инфу");
buttoncont = gtk_fixed_new();
gtk_fixed_move (GTK_FIXED(buttoncont),buttonok,x,y);
gtk_container_add (GTK_CONTAINER (buttoncont), buttonok);
gtk_container_add (GTK_CONTAINER (mainwin), buttoncont);

  /* Показываем окно приложения и виджиты */

  gtk_widget_show_all (mainwin);
  gtk_widget_show_all (buttonok);

  /* Входим в основной цикл и ждем действий пользователя */
  gtk_main ();
  
   return 0;
}
Ошибка начала появляться после добавления строки  
gtk_fixed_move (GTK_FIXED(buttoncont),buttonok,x,y);

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Ошибка при запуске простой программы на GTK+ "  +/
Сообщение от skb7 (ok) on 10-Фев-13, 04:26 
По данной ошибке не подскажу, но...

На C++ совсем не похоже. Если хотите C++ -- очень советую Qt. Он также кросс-платформенный, как и GTK, но документация намного лучше и архитектура фреймворка получше.

Да, и такого рода вещи лучше делать в каком-то дизайнере UI -- это не только быстрее, но и намного гибче. В Qt например есть QtDesigner (интегрированный в их IDE -- QtCreator), и в нем легко накидывается форма мышкой, дальше всё это дело хранится в XML, а на этапе компиляции из XML специальным ui-компилятором создается полноценный C++ код (.h-файл).
Не то, чтобы я за "программирование мышкой" -- но создавать ui в коде со всех сторон некошерно.

Если заинтересовало -- могу подсказать хорошую книгу по Qt (есть в электронке) и кинуть пару ссылок.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Ошибка при запуске простой программы на GTK+ "  +/
Сообщение от skb7 (ok) on 10-Фев-13, 04:52 
По теме: попробуйте перенести вызов gtk_fixed_move() за следующие 2 вызова gtk_container_add(), таким образом:

gtk_container_add (GTK_CONTAINER (buttoncont), buttonok);
gtk_container_add (GTK_CONTAINER (mainwin), buttoncont);
gtk_fixed_move (GTK_FIXED(buttoncont),buttonok,x,y);

Должно помочь.

Хотя у меня и так не сегфолтится.

Собираю так:
g++ `pkg-config --cflags --libs gtkmm-2.4 glibmm-2.4` main.c

Запускается нормально и работает, только в консоль выплёвывает такое:
(a.out:16045): Gtk-CRITICAL **: gtk_fixed_move_internal: assertion `widget->parent == GTK_WIDGET (fixed)' failed

Наверное у меня другая версия GTK.

Если произвести описанное выше изменение -- тогда даже этого предупреждения в консоли нет, всё ок становится. Я не GTK разработчик, просто интуитивно догадался, что нельзя двигать кнопку, пока она не добавлена в контейнер.

И всё же посмотрите в сторону Qt, там всё намного удобнее, мне так кажется. Не пожалеете.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Ошибка при запуске простой программы на GTK+ "  +/
Сообщение от backbone (ok) on 11-Фев-13, 16:55 
http://developer.gnome.org/gtk3/3.0/GtkFixed.html#gtk-fixed-...
void gtk_fixed_move(GtkFixed *fixed, GtkWidget *widget, gint x, gint y);
Moves a child of a GtkFixed container to the given position.

buttonok не является child-ом buttoncont на момент вызова gtk_fixed_move

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру