LINUX.ORG.RU

GTK, помогите разобраться


0

0

Вообщем на завтра надо сдать лабу, с GTK ни разу до этого не имел дело. Ядро лабы есть, надо только обертку в виде GTK сделать. Функции - выбрать файл, "ядро" его примет, как входные параметры, а затем выдать результат. В процессе гугления и чтения офф. доки получил результаты, но не совсем то, что хотел. Код ниже(только интерфейс). Проблемы пока две: как при закрытии диалога выбора файла остаться в GtkMain, а не просто уходить? И вторая - как можно использовать два виджета в главном окне одноверменно - при одновременном gtk_container_add (GTK_CONTAINER (window), vbox) и gtk_container_add(GTK_CONTAINER(window), draw_area) второй не выводится и в консоле ругань, о том, что у window уже есть widget.

anonymous

#include <stdio.h>
#include <gtk/gtk.h>
#include <stdlib.h>


static void menuitem_response (gchar *);
static void do_exit (void);
static int do_open(void);
static int do_show(void);



PangoLayout *layout;

// функция перерисовки GtkDrawingArea
gboolean draw_area_expose_event(GtkWidget* widget, GdkEventExpose* event){
  
  //рисуем закрашенный черным прямоугольник, с верхним левым углом в точке (50, 50)
  // и с длинной/шириной, равными 200
  gdk_draw_rectangle(widget->window, widget->style->black_gc, TRUE, 50, 50, 200, 200);

  //рисуем PangoLayout с левой верхней точкой в (10, 10)
  gdk_draw_layout(widget->window, widget->style->black_gc, 10, 10, layout);

  return TRUE;
}

static void file_ok_sel( GtkWidget        *w,
                         GtkFileSelection *fs )
{
    g_print ("%s\n", gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs)));
}



int main( int   argc,
          char *argv[] )
{

    GtkWidget *window;
    GtkWidget *draw_area;
    GtkWidget *menu;
    GtkWidget *menu_bar;
    GtkWidget *root_menu;
    GtkWidget *menu_items;
    GtkWidget *vbox;
    char buf[128];


    gtk_set_locale();	
    gtk_init (&argc, &argv);
    


    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_default_size (GTK_WINDOW(window), 300, 300);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_widget_set_size_request (GTK_WIDGET (window), 200, 100);
    gtk_window_set_title (GTK_WINDOW (window), "Unix lab with graphics");
    g_signal_connect (G_OBJECT (window), "delete_event",
                      G_CALLBACK (gtk_main_quit), NULL);
                      
                                
    menu = gtk_menu_new ();

       
    sprintf (buf,"Open file...");
    menu_items = gtk_menu_item_new_with_label (buf);
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
    g_signal_connect_swapped (G_OBJECT (menu_items), "activate",
		                      G_CALLBACK (do_open), 
                                      (gpointer) g_strdup (buf));
    gtk_widget_show (menu_items);                                  
    
    sprintf (buf,"Do Calculation...");
    menu_items = gtk_menu_item_new_with_label (buf);
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
    g_signal_connect_swapped (G_OBJECT (menu_items), "activate",
		                      G_CALLBACK (do_show), 
                                      (gpointer) g_strdup (buf));
    gtk_widget_show (menu_items);
    
    sprintf (buf,"Quit...");
    menu_items = gtk_menu_item_new_with_label (buf);
    gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_items);
    g_signal_connect_swapped (G_OBJECT (menu_items), "activate",
		                      G_CALLBACK (do_exit), 
                                      (gpointer) g_strdup (buf));
    gtk_widget_show (menu_items);                                                                        



anonymous
()
Ответ на: комментарий от anonymous

    /* This is the root menu, and will be the label
     * displayed on the menu bar.  There won't be a signal handler attached,
     * as it only pops up the rest of the menu when pressed. */
  root_menu = gtk_menu_item_new_with_label ("ACTIONS");

  gtk_widget_show (root_menu);

    /* Now we specify that we want our newly created "menu" to be the menu
     * for the "root menu" */
    gtk_menu_item_set_submenu (GTK_MENU_ITEM (root_menu), menu);

    /* A vbox to put a menu and a button in: */
  vbox = gtk_vbox_new (FALSE, 0);
  gtk_container_add (GTK_CONTAINER (window), vbox);
  gtk_widget_show (vbox);

    /* Create a menu-bar to hold the menus and add it to our main window */
    menu_bar = gtk_menu_bar_new ();
    gtk_box_pack_start (GTK_BOX (vbox), menu_bar, FALSE, FALSE, 2);
    gtk_widget_show (menu_bar);


    /* And finally we append the menu-item to the menu-bar -- this is the
     * "root" menu-item I have been raving about =) */
    gtk_menu_shell_append (GTK_MENU_SHELL (menu_bar), root_menu);

    /* always display the window as the last step so it all splashes on
     * the screen at once. */
    gtk_widget_show (window);
    
    
 /*   
    
    // добавляем GtkDrawingArea
    draw_area = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(window), draw_area);
  // добавляем обработку события перерисовки GtkDrawingArea
    g_signal_connect(G_OBJECT(draw_area), "expose_event", G_CALLBACK(draw_area_expose_event), NULL);
    gtk_widget_show(draw_area);

  // создаем PangoLayout
    layout = gtk_widget_create_pango_layout(draw_area, "Just an example");
    if(!layout)
	    return 0;
*/	    

    gtk_main ();
    //g_object_unref(layout);

    return 0;
}

/* Print a string when a menu item is selected */

static void menuitem_response( gchar *string )
{
    printf ("%s\n", string);
}
static void do_exit (void)
{
 gtk_main_quit();
}

static int do_open(void)
{
    GtkWidget *filew;
    filew = gtk_file_selection_new ("File selection");
    
    g_signal_connect (G_OBJECT (filew), "destroy",
	              G_CALLBACK (gtk_main_quit), NULL);
    /* Connect the ok_button to file_ok_sel function */
    g_signal_connect (G_OBJECT (GTK_FILE_SELECTION (filew)->ok_button),
		      "clicked", G_CALLBACK (file_ok_sel), (gpointer) filew);
    
    /* Connect the cancel_button to destroy the widget */
    g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button),
	                      "clicked", G_CALLBACK (gtk_widget_destroy),
			      G_OBJECT (filew));
    
    /* Lets set the filename, as if this were a save dialog, and we are giving
     a default filename */
    gtk_file_selection_set_filename (GTK_FILE_SELECTION(filew), 
				     "penguin.png");
    
    gtk_widget_show (filew);
    return 0;
}

static int do_show(void)
{
    GtkWidget *draw_area;
   
    
    // добавляем GtkDrawingArea
    draw_area = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(window), draw_area);
  // добавляем обработку события перерисовки GtkDrawingArea
    g_signal_connect(G_OBJECT(draw_area), "expose_event", G_CALLBACK(draw_area_expose_event), NULL);
    gtk_widget_show(draw_area);

  // создаем PangoLayout
    layout = gtk_widget_create_pango_layout(draw_area, "Just an example");
    if(!layout)
	    return 0;
	    
}

anonymous
()
Ответ на: комментарий от YesSSS

YesSSS

Пасиб. С этим решено. Никак теперь не могу понять - как сделать так, чтобы дочерний виджет отработал(ну типа выбрал\не выбрал файл) и закрылся? Ибо сейчас у меня по ОК срабатывает соотв.функции, но диалог выбора файла не закрывается, а по CANCEL вызывается gtk_widget_destroy

/* Connect the cancel_button to destroy the widget */ g_signal_connect_swapped (G_OBJECT (GTK_FILE_SELECTION (filew)->cancel_button),"clicked", G_CALLBACK (gtk_widget_destroy), G_OBJECT (filew));

Но закрывается и родительское окно :(

anonymous
()
Ответ на: комментарий от anonymous

g_signal_connect (G_OBJECT (filew), "destroy", G_CALLBACK (gtk_main_quit), NULL);

- imho зря написано, это и закрывает основное окно.

Насчет OK - используй gtk_widget_hide(filew) в обработчике

YesSSS ★★★
()
Ответ на: комментарий от YesSSS

thx за ..._hide. Ща буду смотреть...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.