Re: why is class HelloWorld : public Gtk::Window ?



Damon Register said the following:
In the gtkmm tutorial
http://www.gtkmm.org/docs/gtkmm-2.4/docs/tutorial/html/sec-helloworld.html
and elsewhere I have seen this example method used for a gtkmm app.
There is the main() and a class that descends from Gtk::Window as in

class HelloWorld : public Gtk::Window

Why does HelloWorld descend from Gtk::Window?

The classes that derive from Gtk::Window are themselves a Gtk::Window which means they can be shown on the screen and can contain other widgets that can also be shown within the window to the user. See the Gtk::Window API: http://www.gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1Window.html.


I have seen examples for libglademm or gtk-builder which also have
a class such as HelloWorld that descends from Gtk::Window.  So, I have
two questions:

1. Is it necessary to descend from Gtk::Window
   when _not_ using libglademm or gtk-builder such as in the tutorial?

2. Is it necessary to descend from Gtk::Window
   when using libglademm or gtk-builder?

Deriving from Gtk::Window is necessary when the class being developed is to be used as a window to be shown on the screen.


Why do I care?  In trying to find out why I get the
"assertion `G_IS_OBJECT (object)' failed" message, I am trying
different program configurations.

Why not run the different configurations through a debugger? It can help you pinpoint exactly where the warning is coming from.

In the process I have noticed
something interesting.  In an example where
class HelloWorld : public Gtk::Window
I create an instance of the class in the main() with this

    HelloWorld window;

and then in the class constructor I have

    refXml = Gtk::Builder::create_from_file("../hello.xml");
    refXml->get_widget("layout1", layout1);
    layout1->reparent(*this);

When using libglademm I have something similar but in either case I
get the impression that I may have two Windows; one resulting from

    refXml = Gtk::Builder::create_from_file("../hello.xml");

and another because the class descends from Gtk::Window.  Is
that really happening as I suspect?

No. Unless you've defined a Gtk::Window widget in your glade file, you'll only have the one window. Also, it is not a programming error to have more than one Gtk::Window if you need them.

I also noticed that the hello
class is destroyed after Gtk::Main::run finishes.  Is that ok?

If you don't get any error messages or warnings, yes. Debugging might help you pinpoint errors if there are any.

As an experiment I tried
connecting to Gtk::Main::signal_quit and in my signal handler
I call remove().  When I run the program and then exit, I don't
get the error message.

I tried a second experiment which proved interesting (for me
anyway).  Instead of having the hello class descend from
Gtk::Window, I have it not descend from anything.  In the
hello constructor I have

    refXml = Gtk::Builder::create_from_file("../hello.xml");
    refXml->get_widget("hello_main_window", pWindow);

and in the main() I have

    kit.run(*(window.pWindow));

Am I on the right track so far?  At this point I favor making
my class not descend from Gtk::Window as it seems to work but
I would like to know if this makes any sense before I go off
and change my applications.

Either way will work. If you have a class that derives from Gtk::Window in your program you can use that class as a window instead of the "hello_main_window" widget defined in your glade file. If you keep the Gtk::Window in your glade file, you don't need to have a class that derives from Gtk::Window (unless you need more than one window for your program).


Damon Register
_______________________________________________
gtkmm-list mailing list
gtkmm-list gnome org
http://mail.gnome.org/mailman/listinfo/gtkmm-list



--
José Alburquerque
jaalburquerque cox net



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]