Привет всем!Пару дней назад начал постигать азы программирования на С++ под 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++ совсем не похоже. Если хотите C++ -- очень советую Qt. Он также кросс-платформенный, как и GTK, но документация намного лучше и архитектура фреймворка получше.
Да, и такого рода вещи лучше делать в каком-то дизайнере UI -- это не только быстрее, но и намного гибче. В Qt например есть QtDesigner (интегрированный в их IDE -- QtCreator), и в нем легко накидывается форма мышкой, дальше всё это дело хранится в XML, а на этапе компиляции из XML специальным ui-компилятором создается полноценный C++ код (.h-файл).
Не то, чтобы я за "программирование мышкой" -- но создавать ui в коде со всех сторон некошерно.Если заинтересовало -- могу подсказать хорошую книгу по Qt (есть в электронке) и кинуть пару ссылок.
По теме: попробуйте перенести вызов 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, там всё намного удобнее, мне так кажется. Не пожалеете.
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