[gtkmm] Problem beim Auslesen eines Textfeldes
-
Hi Leute,
da ich mich nun dazu entschlossen habe, einen Komplettumstieg auf Linux zu machen, habe ich mir gedacht, dass ich mir vielleicht etwas Wissen über GUI-Entwicklung mit gtkmm zu aneignen könnte.
Die Installation verlief reibungslos und die ersten Testbeispiele aus der Dokumentation stellten auch keine großen Probleme dar. Nun habe ich aber ein eigenes kleines Programm geschrieben, welches nicht ganz so will, wie ich es gern hätte. Hier erstmal der Quellcode:
main.cpp
//--- Header-Dateien -------------------------------------- #include <gtkmm/main.h> #include "test.h" //--- Hauptprogramm --------------------------------------- int main(int argc, char* argv[]) { Gtk::Main kit(argc, argv); Test test; Gtk::Main::run(test); return 0; }
test.h
//--- Definitionen ---------------------------------------- #ifndef TEST_H #define TEST_H //--- Header-Dateien -------------------------------------- #include <gtkmm/button.h> #include <gtkmm/entry.h> #include <gtkmm/box.h> #include <gtkmm/window.h> class Test : public Gtk::Window { public: Test(); virtual ~Test(); protected: // Signal-Handler virtual void on_button_clicked(Glib::ustring data); // Widgets Gtk::HBox m_box; Gtk::Entry m_entry; Gtk::Button m_button; }; #endif // TEST_H
test.cpp
//--- Header-Dateien -------------------------------------- #include "test.h" #include <iostream> //--- Konstruktor ----------------------------------------- Test::Test() : m_button("Anzeigen") { // Fenstertitel setzen set_title("Wie ist dein Name?"); // Rahmenabstand festlegen set_border_width(10); // die Box dem Fenster hinzufügen add(m_box); // Klicksignal verarbeiten m_button.signal_clicked().connect(sigc::bind<Glib::ustring>(sigc::mem_fun(*this, &Test::on_button_clicked), m_entry.get_text())); // das Textfeld hinzufügen und anzeigen m_box.pack_start(m_entry); m_entry.show(); // den Button der Box hinzufügen und anzeigen m_box.pack_start(m_button); m_button.show(); // komplette Box anzeigen m_box.show(); } //--- Destruktor ------------------------------------------ Test::~Test() { } //--- Signal-Handler -------------------------------------- void Test::on_button_clicked(Glib::ustring data) { std::cout << "Hello, " << data << std::endl; }
Man soll die Möglichkeit haben, in das Textfeld seinen Namen einzutragen und dann auf den Button klicken zu können. Es wird auf jedenfall alles richtig dargestellt, aber anstelle von Hello, (NAME) kommt nur Hello, . Nun stellt sich mir die Frage, wo das Problem liegt. Wenn ich anstelle von
m_entry.get_text()
"Rene"
dann funktioniert alles ordnungsgemäß. Kann mir vielleicht einer von euch mal sagen, woran das liegt und wo mein Fehler ist? Wäre echt sehr nett und ich wäre euch sehr dankbar.
Danke schonmal...
MfG Apo
-
m_button.signal_clicked().connect(sigc::bind<Glib::ustring>(sigc::mem_fun(*this, &Test::on_button_clicked), m_entry.get_text()));
sigc::bind empfängt hier m_entry.get_text(), dass zu diesem Zeitpunkt nartürlich noch leer ist und bindet es an den Funktions aufruf. Dass der Wert "" von m_entry.get_text() kommt weiß es nicht und geht damit also so um als wäre es ein Literal. Jedes mal wenn du auf den Button klickst wird also on_button_clicked("") aufgerufen. Das sich get_text() ändert ist ja egal.
Du musst also get_text() nochmal aufrufen um den Text auszulesen. Mach das am besten in on_button_clicked, m_entry ist ja ein Member, deswegen kannst du einfach folgendes machen:void Test::on_button_clicked() { std::cout << "Hello, " << m_entry.get_text() << std::endl; }
mfg.
-
Okay..., danke. Dann werde ich das so machen. ^^
MfG Apo
-
Ach ja, was ich noch sagen wollte: Du brauchst nicht für jedes Widget die show() Methode aufrufen. Einmal show_all_children(); am Ende des Konstruktors reicht
-
Okay..., danke. das werde ich dann gleich mal ändern. ^^
MfG Apo