LINUX.ORG.RU

GTK - aboutdialog


0

0

В glade2 я создал окошко, в нем меню и + создал еще
 окошко aboutdialog.

Подскажите как показать это окошко, созданное в глейд,
при нажатии на пункт в меню? А то когда я делаю:

void on_about_activate(GtkMenuItem * menuitem, gpointer user_data)
{
 GtkWindow *window = GTK_WINDOW(lookup_widget(GTK_WIDGET(menuitem),"aboutdialog"));
 gtk_show_about_dialog(window,NULL);
}

прога показывает дефолтное пустое aboutdialog окошко :(
anonymous

Ответ на: комментарий от Pi

Прочитав, все равно не понятно что я делаю не так

anonymous
()

void on_about_activate(GtkMenuItem * menuitem, gpointer user_data)
{
 gtk_show_about_dialog(NULL,
                       "name", "Proga",
                       "comments", "Super Proga",
                       "copyright", "(C) 2005, Vasia Pupkin",
                       NULL);
}

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

>ananas

Я aboutdialog создал с помощью glade2. Он создал ф-ию в interface.c:

GtkWidget*
create_aboutdialog (void)
{
  GtkWidget *aboutdialog;
  const gchar *authors[] = {
    "bla bla,",
    "bla bla bla",
    NULL
  };
  /* TRANSLATORS: Replace this string with your names, one name per line. */
  gchar *translators = "Today no translate";

  aboutdialog = gtk_about_dialog_new ();
  gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (aboutdialog), VERSION);
  gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (aboutdialog), _("PCC"));
  gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (aboutdialog), _("(c) bla bla"));
  gtk_about_dialog_set_comments (GTK_ABOUT_DIALOG (aboutdialog), _("PPC real"));
  gtk_about_dialog_set_license (GTK_ABOUT_DIALOG (aboutdialog), _("sdfsdsfsfsd"));
  gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (aboutdialog), "http://none");
  gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (aboutdialog), authors);
  gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (aboutdialog), translators);

  /* Store pointers to all widgets, for use by lookup_widget(). */
  GLADE_HOOKUP_OBJECT_NO_REF (aboutdialog, aboutdialog, "aboutdialog");

  return aboutdialog;
}

И вот не ясно мне эту ф-ию create_aboutdialog вызвать в main.c сразу
 за созданием главного окна... если это так, то как потом указатель на
окно aboutdialog выцепить с помощью lookup_widget? Или же в GTK надо
 создавать все окна (кроме главного) уже непосредственно перед их использованием?

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

Т.е. как я понимаю так надо действовать со всеми окошками кроме главного?
А нет такой практики что создаешь все окошки при запуске программы а потом их показываешь/скрываешь?

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

не,.. ты оч. интересный человек...

создать ты можешь где угодно, хоть в каком-нидь on_main_window_create /скажем/. а по нажатию кнопки в меню, диалог найти и показать. я уже не говорю о том, что из диалогов обычно делают синглтон /имхо, хотя для абаутов эт не особо актуально/.

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

> а по нажатию кнопки в меню, диалог найти и показать

В том то и смысл что окно эбаута не находится!

Допустим я в

void main()
{
 ...
 GtkWidget *about;

 about = create_aboutdialog();
 ..
}

А в сигнале делаю:
void on_about_activate(GtkMenuItem * menuitem, gpointer user_data)
{
GtkWindow *window = lookup_widget(GTK_WIDGET(menuitem),"aboutdialog");
// window == NULL :(
}

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

а с какой радости он должен находиться, если вы корнем указываете menuitem? укажите основное окно, и будет вам счастье

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

void on_about_activate(GtkMenuItem * menuitem, gpointer user_data) 
{ 
 GtkWidget *main_window = lookup_widget(GTK_WIDGET(menuitem),"main_window"); 
 GtkWidget *aboutdialog = lookup_widget(main_window,"aboutdialog"); 
 if(aboutdialog != NULL) gtk_widget_show(aboutdialog); 
} 
 
main_window находит,а aboutdialog все равно нет :(

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

а вообще да, это я ступил...

пока не был дернут create_aboutdialog(), виджета aboutdialog не существует. и, соответственно, искать его бессмыслено.

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

>пока не был дернут create_aboutdialog(), виджета aboutdialog не существует. и, соответственно, искать его бессмыслено.

Смотри мой пост от 27.09.2005 21:05:57. Я ф-ию create_aboutdialog() "дергаю" в main(). Но после этого все равно не могу найти этот виджет aboutdialog :(

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

Короче, Mrak.

Учись делать правильно. Вот тебе пример из трех файлов, как правильно работать с glade. Кстати, для создания интерфейсов рекомендуется использовать gazpacho - гораздо более удобная прога для редактирования glade файлов. Код, сгенерированный glade лучше не использовать.

В примере внизу я gnomo вский about использовал, потому что под рукой 2.6 не было, но сути это не меняет.

---------------------- Makefile ------------------------ test: test.c gcc `pkg-config libglade-2.0 --cflags --libs` -o test test.c ---------------------- test.c --------------------------

#include <gtk/gtk.h> #include <glade/glade-xml.h>

static void on_about (GtkWidget *widget, gpointer data) { GladeXML *xml = GLADE_XML (data); GtkWidget *about_dialog; xml = glade_xml_new ("test.glade", "about2", NULL); about_dialog = glade_xml_get_widget (xml, "about2");

gtk_dialog_run (GTK_DIALOG (about_dialog)); return; }

int main (int argc, char * argv[]) { GtkWidget *main_window; GtkWidget *about_menu_item; GladeXML *xml;

gtk_init (&argc, &argv); xml = glade_xml_new ("test.glade", "window1", NULL);

main_window = glade_xml_get_widget (xml, "window1"); gtk_widget_show_all (main_window); about_menu_item = glade_xml_get_widget (xml, "about1"); g_signal_connect (about_menu_item, "activate", G_CALLBACK (on_about), NULL); gtk_main(); return 0; }

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

Короче, Mrak. 

Учись делать правильно. Вот тебе пример из трех файлов, как правильно работать с glade. Кстати, для создания интерфейсов рекомендуется использовать gazpacho - гораздо более удобная прога для редактирования glade файлов. Код, сгенерированный glade лучше не использовать.

В примере внизу я gnomo вский about использовал, потому что под рукой 2.6 не было, но сути это не меняет.

---------------------- Makefile ------------------------
test: test.c
	gcc `pkg-config libglade-2.0 --cflags --libs` -o test test.c
---------------------- test.c --------------------------

#include <gtk/gtk.h>
#include <glade/glade-xml.h>

static void
on_about (GtkWidget *widget, gpointer data)
{
    GladeXML *xml = GLADE_XML (data);
    GtkWidget *about_dialog;
    
    xml = glade_xml_new ("test.glade", "about2", NULL);
    about_dialog = glade_xml_get_widget (xml, "about2");    

    gtk_dialog_run (GTK_DIALOG (about_dialog));
    
    return;
}

int 
main (int argc, char * argv[])
{
    GtkWidget *main_window;
    GtkWidget *about_menu_item;
    GladeXML *xml;

    gtk_init (&argc, &argv);
    
    xml = glade_xml_new ("test.glade", "window1", NULL);

    main_window = glade_xml_get_widget (xml, "window1");
    gtk_widget_show_all (main_window);
    
    about_menu_item = glade_xml_get_widget (xml, "about1");
    g_signal_connect (about_menu_item, "activate", G_CALLBACK (on_about), NULL);
    
    gtk_main();
    return 0;
}

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

Достало лоровское форматирование.

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*--> <!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">;

<glade-interface> <requires lib="gnome"/>

<widget class="GtkWindow" id="window1"> <property name="visible">True</property> <property name="title" translatable="yes">window1</property> <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property>

<child> <widget class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property>

<child> <widget class="GtkMenuBar" id="menubar1"> <property name="visible">True</property>

<child> <widget class="GtkMenuItem" id="menuitem"> <property name="visible">True</property> <property name="label" translatable="yes">_Help</property> <property name="use_underline">True</property>

<child> <widget class="GtkMenu" id="menuitem_menu">

<child> <widget class="GtkMenuItem" id="about1"> <property name="visible">True</property> <property name="label" translatable="yes">_About</property> <property name="use_underline">True</property> <signal name="activate" handler="on_about1_activate" last_modification_time="Wed, 28 Sep 2005 15:04:49 GMT"/> </widget> </child> </widget> </child> </widget> </child> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> </packing> </child>

<child> <widget class="GtkLabel" id="label1"> <property name="visible">True</property> <property name="label" translatable="yes">Hello world </property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> </widget> <packing> <property name="padding">0</property> <property name="expand">False</property> <property name="fill">False</property> </packing> </child> </widget> </child> </widget>

<widget class="GnomeAbout" id="about2"> <property name="visible">True</property> <property name="destroy_with_parent">False</property> <property name="copyright" translatable="yes">Foo Bar</property> <property name="comments" translatable="yes">Simple test program</property> <property name="authors">Vasya Pupkin</property> <property name="translator_credits" translatable="yes">translator_credits</property> </widget>

</glade-interface>

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

<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-interface SYSTEM "http://glade.gnome.org/glade-2.0.dtd">;

<glade-interface>
<requires lib="gnome"/>

<widget class="GtkWindow" id="window1">
  <property name="visible">True</property>
  <property name="title" translatable="yes">window1</property>
  <property name="type">GTK_WINDOW_TOPLEVEL</property>
  <property name="window_position">GTK_WIN_POS_NONE</property>
  <property name="modal">False</property>
  <property name="resizable">True</property>
  <property name="destroy_with_parent">False</property>

  <child>
    <widget class="GtkVBox" id="vbox1">
      <property name="visible">True</property>
      <property name="homogeneous">False</property>
      <property name="spacing">0</property>

      <child>
	<widget class="GtkMenuBar" id="menubar1">
	  <property name="visible">True</property>

	  <child>
	    <widget class="GtkMenuItem" id="menuitem">
	      <property name="visible">True</property>
	      <property name="label" translatable="yes">_Help</property>
	      <property name="use_underline">True</property>

	      <child>
		<widget class="GtkMenu" id="menuitem_menu">

		  <child>
		    <widget class="GtkMenuItem" id="about1">
		      <property name="visible">True</property>
		      <property name="label" translatable="yes">_About</property>
		      <property name="use_underline">True</property>
		      <signal name="activate" handler="on_about1_activate" last_modification_time="Wed, 28 Sep 2005 15:04:49 GMT"/>
		    </widget>
		  </child>
		</widget>
	      </child>
	    </widget>
	  </child>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">False</property>
	  <property name="fill">False</property>
	</packing>
      </child>

      <child>
	<widget class="GtkLabel" id="label1">
	  <property name="visible">True</property>
	  <property name="label" translatable="yes">Hello world
</property>
	  <property name="use_underline">False</property>
	  <property name="use_markup">False</property>
	  <property name="justify">GTK_JUSTIFY_LEFT</property>
	  <property name="wrap">False</property>
	  <property name="selectable">False</property>
	  <property name="xalign">0.5</property>
	  <property name="yalign">0.5</property>
	  <property name="xpad">0</property>
	  <property name="ypad">0</property>
	</widget>
	<packing>
	  <property name="padding">0</property>
	  <property name="expand">False</property>
	  <property name="fill">False</property>
	</packing>
      </child>
    </widget>
  </child>
</widget>

<widget class="GnomeAbout" id="about2">
  <property name="visible">True</property>
  <property name="destroy_with_parent">False</property>
  <property name="copyright" translatable="yes">Foo Bar</property>
  <property name="comments" translatable="yes">Simple test program</property>
  <property name="authors">Vasya Pupkin</property>
  <property name="translator_credits" translatable="yes">translator_credits</property>
</widget>

</glade-interface>

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

Спасибо за коментарии... Впринципе все ясно в твоем коде, но...

Я не ставил задачу разобраться с libglade! Мне хочется понять как работать с кодом, сгенерированным glade2! В случае с xml все очень прозрачно и понятно как получать указатель на окошки... но как его получить работая чисто с glade2, что-то не ясно :(

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