[gtkmm] FileChooser nur open möglich
-
Hallo!
Ich benutzte zum Gestalten der GUI Glade 3.4 und lade dieses Gladefile dann mit libglademm. Wenn ich allerdings versuche einen FileChooserButton in die Action SAVE oder CREATE_FOLDER zu schalten, dann bekomme ich auf cerr
Gtk-WARNING **: gtk_file_chooser_button_set_property: Choosers of type `gtkmm__GtkFileChooserButton' do not support `GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER'.
bzw.
Gtk-WARNING **: gtk_file_chooser_button_set_property: Choosers of type `gtkmm__GtkFileChooserButton' do not support `GTK_FILE_CHOOSER_ACTION_SAVE'.
Mir ist klar, dass das Problem an der Runtime bzw. meinen Development Files liegen muss. Allerdings weis ich nicht wie ich es beheben soll.
Ich benutze gtkmm und gtk jeweils in der Version 2.10.11-1 als runtime bzw. development librarys unter Windows XP. Eigentlich sollte es doch gehen oder liege ich da falsch? Gibt es aktuellere Windows Builds bzw. wo kann ich diese finden?
Hoffe ihr könnt mir dabei helfen
mfg squall23
-
Wirklich niemand eine Idee?
Könnt ihr mir vielleicht ein Forum oder eine Newsgroup empfehlen, die für diese Frage richtig ist bzw. in der ich auf Lösung hoffen kann?
mfg squall23
-
Mal etwas anders gefragt. Ist das was ich vorhabe überhaupt in gtkmm implementiert? Wenn ich mir die Doxygen doku auf gtkmm.org ansehe dann würde ich zu ja tendieren. Allerdings habe ich die selbe GUI gerade unter meinem aktuellen Kubuntu probiert und dort läufts auch nicht. (die selben Fehler)
Was sagt ihr dazu?
-
Könnte mir wenigstens einer eine Runtime-Kombination sagen, bei der folgendes Programm funktioniert?
#include<gtkmm.h> int main(int argc, char **argv) { Gtk::Main Kit(argc,argv); Gtk::Window Window; Gtk::FileChooserButton Button("Test",Gtk::FILE_CHOOSER_ACTION_SAVE); Window.add(Button); Window.show_all(); Kit.run(Window); }
Wie gesagt, kompilieren ist kein Problem. Nur lässt sich der Button bei mir nicht in den Save Modus schalten.
-
Ähm, also mir haut's mit gtkmm 2.12.7 auch
(main:9876): Gtk-WARNING **: gtk_file_chooser_button_set_property: Choosers of type `gtkmm__GtkFileChooserButton' do not support `GTK_FILE_CHOOSER_ACTION_SAVE'.
um die Ohren.
Wo genau in der Dokumentation hast du denn gelesen, dass es (anscheinend) geht?
-
Direkt gelesen hab ichs nirgends. War nur ein Rückschluss aus der GTKmm API-Dokumentation. (http://www.gtkmm.org/docs/gtkmm-2.4/docs/reference/html/classGtk_1_1FileChooserButton.html)
Der Enum mit gültigen Actions enthält insgesamt vier Varianten,
FILE_CHOOSER_ACTION_OPEN
FILE_CHOOSER_ACTION_SAVE
FILE_CHOOSER_ACTION_SELECT_FOLDER
FILE_CHOOSER_ACTION_CREATE_FOLDERwobei nur open und select_folder bei mir funktionieren.
Außerdem besteht beim GUI Design mit Glade die Möglichkeit auf diese Actions umzuschalten.Danke auf jeden Fall mal für den Versuch!
-
Hm, kann gut sein, dass es bisher noch nicht implementiert wurde. Aber in dem Fall bleibt dir eig. nur ein (mehr oder weniger) kurzer Blick in den Quellcode von gtkmm
-
Ich hab mich jetzt mal an deine Vorschlag gehalten und mir den Source zu Gemüte geführt, und kam zu folgender Erkenntnis.
Von der GTKmm Seite ist dieses "Feature" implementiert, alldings von GTK nicht unterstützt.
Ich habe ein leicht modifiziertes GTK Demoprogram verwendet um das zu überprüfen:
#include <gtk/gtk.h> /* This is a callback function. The data arguments are ignored * in this example. More on callbacks below. */ static void hello( GtkWidget *widget, gpointer data ) { g_print ("Hello World\n"); } static gboolean delete_event( GtkWidget *widget, GdkEvent *event, gpointer data ) { /* If you return FALSE in the "delete_event" signal handler, * GTK will emit the "destroy" signal. Returning TRUE means * you don't want the window to be destroyed. * This is useful for popping up 'are you sure you want to quit?' * type dialogs. */ g_print ("delete event occurred\n"); /* Change TRUE to FALSE and the main window will be destroyed with * a "delete_event". */ return FALSE; } /* Another callback */ static void destroy( GtkWidget *widget, gpointer data ) { gtk_main_quit (); } int main( int argc, char *argv[] ) { /* GtkWidget is the storage type for widgets */ GtkWidget *window; GtkWidget *button; /* This is called in all GTK applications. Arguments are parsed * from the command line and are returned to the application. */ gtk_init (&argc, &argv); /* create a new window */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); /* When the window is given the "delete_event" signal (this is given * by the window manager, usually by the "close" option, or on the * titlebar), we ask it to call the delete_event () function * as defined above. The data passed to the callback * function is NULL and is ignored in the callback function. */ g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL); /* Here we connect the "destroy" event to a signal handler. * This event occurs when we call gtk_widget_destroy() on the window, * or if we return FALSE in the "delete_event" callback. */ g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL); /* Sets the border width of the window. */ gtk_container_set_border_width (GTK_CONTAINER (window), 10); /* Creates a new button with the label "Hello World". */ button = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE); /* This packs the button into the window (a gtk container). */ gtk_container_add (GTK_CONTAINER (window), button); /* The final step is to display this newly created widget. */ gtk_widget_show (button); /* and the window */ gtk_widget_show (window); /* All GTK applications must have a gtk_main(). Control ends here * and waits for an event to occur (like a key press or * mouse event). */ gtk_main (); return 0; }
Es war mir auch möglich im GTK Code herauszufinden, dass explizit nur die beiden Modi GTK_FILE_CHOOSER_ACTION_OPEN und GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER unterstütz sind. Dies ist unter anderem an der Implementierung von gtk_file_chooser_widget_new ersichtlich:
GtkWidget * gtk_file_chooser_button_new (const gchar *title, GtkFileChooserAction action) { g_return_val_if_fail (action == GTK_FILE_CHOOSER_ACTION_OPEN || action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, NULL); return g_object_new (GTK_TYPE_FILE_CHOOSER_BUTTON, "action", action, "title", (title ? title : _(DEFAULT_TITLE)), NULL); }
Ich werde mich jetzt mal an die GTK Mailinglist wenden und hoffe ich kann jemanden überzeugen, dass die anderen Modis auch unterstützt werden
bzw. hoffe ich eine Begründung für ihr Fehlen zu erhalten.
Falls sich was ergibt lasse ich es euch wissen!
Auf jeden Fall ein herzliches DANKE an GPC. Ich dachte schon ich finde niemanden mehr der mir in irgendeiner Weise helfen kann.
mfg squall23
-
Hab gerade gesehen, das ich den falschen GTK Beispiel Code gepostet habe. Die Zeile
button = gtk_file_chooser_widget_new(GTK_FILE_CHOOSER_ACTION_SAVE);
müsste eigentlich
button = gtk_file_chooser_button_new("test",GTK_FILE_CHOOSER_ACTION_SAVE);
lauten. Dann ist der Fehler reproduzierbar.
Außerdem ist der Codeausschnitt unten natürlich die Implementierung von gtk_file_chooser_button_new und nicht von gtk_file_chooser_widget_new.