Projects/gtkmm/FAQ - GNOME Wiki! (original) (raw)

[ 中文 ]

gtkmm Frequently Asked Questions

gtkmm's place in the world

What is GTK+?

GTK+ is the GUI widget toolkit, written in C, which serves as the foundation for the GNOME project as well as many stand-alone applications. GTK+ is the foundation on which gtkmm is built. See http://www.gtk.org/ .

What is gtkmm?

gtkmm is a C++ wrapper for GTK+. That is, it is a language binding that lets you use GTK+ from C++. This includes support for C++ features such as inheritance, polymorphism and other powerful techniques which C++ programmers expect to have at their disposal.

Why is it named gtkmm?

gtkmm was originally named gtk-- because GTK+ already has a + in the name. However, as -- is not easily indexed by search engines the package generally went by the name gtkmm, and that's what we stuck with.

Why use gtkmm instead of GTK+?

Why use libsigc++? Why not just use the regular GTK+ signal functions?

Why isn't GTK+/GNOME itself written in C++.

Why not just use Qt if you like C++ so much?

gtkmm developers tend to prefer gtkmm to Qt because gtkmm does things in a more C++ way. Qt originates from a time when C++ and the standard library were not standardized or well supported by compilers. It therefore duplicates a lot of stuff that is now in the standard library, such as containers and type information. Most significantly, they modified the C++ language to provide signals, so that Qt classes can not be used easily with non-Qt classes. gtkmm was able to use standard C++ to provide signals without changing the C++ language.

Also, gtkmm and the other *mm modules allow you to build software which works more closely with the GNOME desktop.

How good is gtkmm

What systems does it run under?

gtkmm should run under any UNIX-type system with the proper compilers and libraries installed. The GNU C++ compiler (g++, part of gcc) together with the GNU toolset (such as found on Linux and *BSD systems) comprise its default build environment.

gtkmm can also be be built and used with:

How complete is it?

gtkmm tries to offer all of the functionality offered by GTK+. This means that you should be able to do anything with gtkmm that's supported by GTK+, and do it more easily. If something isn't covered then we want to know about it.

Does gtkmm support all the C++ goodies like inheritance, polymorphism, etc?

Yes. gtkmm objects are normal C++ objects which implement the GTK+ inheritance model through C++ inheritance. You can do with the gtkmm widgets everything that you can do with any other C++ class.

Does gtkmm use Standard C++ (STL) containers such as std::string and std::list

Yes, we believe in reusing standard C++ code wherever possible. This might not be obvious at first because:

In addition, some widgets, such as Gtk::TreeView, have interfaces which are very similar to the standard containers. For instance, you can iterate through the selected rows.

Does gtkmm force STL-style interfaces onto GTK+ widgets in a way that is inappropriate, difficult, or badly-implemented?

No, we do not force you. We have provided STL-style interfaces for some container widgets, to allow you to iterate over the child widgets, but these are in addition the the simpler interfaces. We have done this because we believe that STL-style interfaces sometimes require too much code to perform simple tasks. On the other hand, some people religiously prefer STL-code wherever possible. You have the choice.

These STL-interfaces are implemented with quite simple code and have been found to work without problems. There are no known bugs, as you can see on the bugs page.

Some classes such as Gtk::TextBuffer have only an STL-style interface. This is because the underlying widget has an STL-style interface, implemented in C. So this is the most appropriate, and easiest, way to wrap that API in C++.

Does the gtkmm API use C types, such as structs?

No, we wrap almost all parameters as C++ classes. which use C++ memory management. If you find parameters that use C types without good reason then we want to know about it.

What applications have been written in gtkmm?

Check out the list of applications on the Additional Resources page from the gtkmm site.

How does gtkmm compare to Qt?

Have you wrapped all of the GNOME APIs as well as GTK+?

Yes, we have wrapped most of the useful and stable GNOME APIs in other *mm modules.

Is gtkmm "bloated"

No, gtkmm is a thin wrapper.

Further information

Is there a gtkmm mailing list?

Yes. See the subscription page

What documentation is there for gtkmm?

There is a largely complete tutorial, automatically-generated reference documentation, and a wealth of running examples available at the gtkmm documentation page

Where can I find some example code?

See the examples directory in the gtkmm-documentation module. Most of these appear in the gtkmm book. There are also several large third-party applications whose source you can examine.

Using gtkmm

What compiler arguments should I use to compile a gtkmm program?

See the Headers and Linking section in the gtkmm book.

How can I get the GTK+ object from a gtkmm object?

If you need some GTK+ functionality which is not supported through gtkmm, you can call Gtk::Widget::gobj() (gtkobj() in gtkmm version 1.x) which will return a pointer to the plain C GTK+ data structure. You can then operate directly on this C object as you would in any GTK+ program.

How can I wrap a GTK+ widget in a gtkmm instance?

Glib::wrap() will give you a pointer to gtkmm object. It is an overloaded function, so it will give you an instance of the appropriate class.

Can I use C++ exceptions with gtkmm?

Yes, it is possible but it is not a very good idea. The official answer is that, since plain C doesn't know what a C++ exception is, you can use exceptions in your gtkmm code as long as there are no C functions in your call stack between the thrower and the catcher. This means that you have to catch your exception locally.

You will be warned at runtime about uncaught exceptions, and you can specify a different handler for uncaught exceptions. Some gtkmm methods do even use exceptions to report errors. The exceptions types that might be thrown are listed in the reference documentation of these methods.

How can I use Glade and/or libglade with gtkmm?

See the Gtk::Builder section in the gtkmm book.

What does Gtk::manage(widget) do?

This means 'The container widget will delete this widget.' Some people prefer to use it so that they don't need to worry about when to delete their widgets. Gtk::manage() should only be used when add()ing a widget to a container widget.

How can I learn about arranging widgets? I am confused by the packing options

Glade is a great way to see what can be done with GTK+ and GNOME widgets. Use Glade to explore the choice of widgets and to see how they can be put together. You should then be able to use the same settings as arguments to your widget constructors, and to the add() and pack() method. Or you could use Gtk::Builder (or libglademm) to load the GUI at runtime.

I'm used to MFC. Where's the Document and the View? or How do I use the Document/View idea? or How do I use the MVC pattern?

How do I load pictures for use with gtkmm?

Use Gdk::Pixbuf and/or Gtk::Image. Both are easy to use and support a wide range of image file types via pixbuf loader plugins.

Is gtkmm thread-safe?

Paul Davis wrote:

Neither X, nor GDK nor GTK+ nor gtkmm are thread safe by themselves. You must use either the gdk_threads_{enter,leave}() functions to protect any and every call to GDK/GTK+/gtkmm functions, or alternatively, ensure that only a single thread makes such calls. One common way to do this is to have non-GUI threads send requests to the GUI thread via a pipe. The pipe is hooked into the main glib event loop used by GTK.

Personally, i have always used the single-threaded approach, which I find much more suitable for my apps.

Note that glibmm comes with Glib::Dispatcher, which implements a cross-thread signal using the pipe approach described above.

Andreas Rottmann added:

If you need a more sophisticated cross-thread message-passing approach, take a look at libsigc++ extras. It provides cross-thread, typesafe slot invocation on top of libsigc++ and comes with a gtkmm example.