Bei diesem Beispiel zeige ich euch eine Möglichkeit Boxes zuverwenden.
Boxes sind Widget-( Komponenten ) Container die mindestens 1 Objekt aufnehmen. Gtk+ und somit auch gtkmm ist nach dem Boxen prinzip aufgebaut, ein Fenster (z.B Gtk::Window) kann nur 1 Objekt aufnehmen, aber da ein Fenster meist aus vielen Objekten besteht, kann man dort z.b. ein VBox einfügen und somit dann beliebig viele sub elemente mit vertikaler Anordnung hinzufügen, oder mit einem HBox in Horizontaler Anordnung.
Es gibt auch ein Table das eben eine Tabelle für solche boxen bereitstellt, aber auf das komm ich später mal.
C/C++ Code:
#include <gtkmm.h> // Bindet alles was man für gtkmm braucht ein (Braucht dann alles auch länger beim kompilieren
C/C++ Code:
#include <gtkmm.h> // Bindet alles was man für gtkmm braucht ein (Braucht dann alles auch länger beim kompilieren
C/C++ Code:
#include <gtkmm.h> // Bindet alles was man für gtkmm braucht ein (Braucht dann alles auch länger beim kompilieren
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
1 2 3 4 5 6 7 8 9 10 11 12 13
struct MyWindow : public Gtk::Window
{
MyWindow(); // Konstruktor
Gtk::Button m_ok_button; // Button Objekt, wegen der Initialisierungsliste das erste Objekt!
Gtk::Entry m_edit; // Ein Editfeld bzw Entry
Gtk::Label m_labels[2]; // 2 Labels / Textfelder enum { MW_Label1 , MW_Label2 }; // Index ersatz für unser Label Array
void on_button_ok_clicked(); // Funktion die beim Clicked-Signal des Buttons ausgeführt wird
};
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
struct MyWindow : public Gtk::Window
{
MyWindow(); // Konstruktor
Gtk::Button m_ok_button; // Button Objekt, wegen der Initialisierungsliste das erste Objekt!
Gtk::Entry m_edit; // Ein Editfeld bzw Entry
Gtk::Label m_labels[2]; // 2 Labels / Textfelder enum { MW_Label1 , MW_Label2 }; // Index ersatz für unser Label Array
void on_button_ok_clicked(); // Funktion die beim Clicked-Signal des Buttons ausgeführt wird
};
C/C++ Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
struct MyWindow : public Gtk::Window
{
MyWindow(); // Konstruktor
Gtk::Button m_ok_button; // Button Objekt, wegen der Initialisierungsliste das erste Objekt!
Gtk::Entry m_edit; // Ein Editfeld bzw Entry
Gtk::Label m_labels[2]; // 2 Labels / Textfelder enum { MW_Label1 , MW_Label2 }; // Index ersatz für unser Label Array
void on_button_ok_clicked(); // Funktion die beim Clicked-Signal des Buttons ausgeführt wird
};
Es gibt in Gtk+/gtkmm so genannte Stockitems das sind Bilder und Texte die sich an die aktuellen Style Einstellungen anpassen und an das aktuelle locale
Wir benutzen für unseren Button einfach mal das Standard OK, und machen das folgendermaßen, in der Initialisierungsliste des Konstruktors. Da Elemente der Reihenfolge nach in der Intialisierungsliste aufgeführt werden müssen haben wir auch in der Deklaration den Button als erstes angegeben.
set_title(Glib::locale_to_utf8("gtkmm Beispiel 2")); // Setzen des Fenstertitels
Gtk::VBox * vbox = new Gtk::VBox; // Wir erstellen eine Vertikale Box für unsere widgets
add(*Gtk::manage(vbox)); // Wir übergeben die VBox an unser Fenster und sorgen dafür das es automatisch gelöscht wird
vbox->set_homogeneous(true); // für gleichmässigkeit sorgen
vbox->set_spacing( 10 ); // Platzzwischen den Elementen des VBoxes
vbox->set_border_width( 10 ); // Randbreite auf 10 Pixel setzen
vbox->pack_start( m_labels[ MW_Label1 ],true,true); // Wir fügen das erste Label in den ersten Abschnitt des vbox ein
Gtk::HBox * hbox = new Gtk::HBox; // Neues Box objekt ( Horizontal (wer hätte das gedacht ? ;) ) )
vbox->pack_start( *Gtk::manage( hbox )); // Nun übergeben wir das HBox und sorgen, wie wir das beim VBox auch getan haben dafür dass user Objekt automatisch gelöscht wird
hbox->pack_start( m_labels[ MW_Label2 ] ); // Nun fügen wir das 2te Label noch hinzu
hbox->pack_start( m_edit ); // Nun noch das Editfeld / Entry
hbox->set_spacing( 15 );
vbox->pack_start( m_ok_button ); // Und den natürlich dann den button Button
// Nun setzen wir den Text der Labels
m_labels[MW_Label1].set_text(Glib::locale_to_utf8("Gib nen Text ein und klick OK!"));
m_labels[MW_Label2].set_text(Glib::locale_to_utf8("Text eingeben: "));
// Wir setzen die Callback Methode für das click signal
m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));
// Alle Widgets anzeigen
show_all();
}
void MyWindow::on_button_ok_clicked()
{
// Wir lesen den Text vom Entry und übergeben diesen an das Label
m_labels[MW_Label1].set_text( m_edit.get_text());
}
set_title(Glib::locale_to_utf8("gtkmm Beispiel 2")); // Setzen des Fenstertitels
Gtk::VBox * vbox = new Gtk::VBox; // Wir erstellen eine Vertikale Box für unsere widgets
add(*Gtk::manage(vbox)); // Wir übergeben die VBox an unser Fenster und sorgen dafür das es automatisch gelöscht wird
vbox->set_homogeneous(true); // für gleichmässigkeit sorgen
vbox->set_spacing( 10 ); // Platzzwischen den Elementen des VBoxes
vbox->set_border_width( 10 ); // Randbreite auf 10 Pixel setzen
vbox->pack_start( m_labels[ MW_Label1 ],true,true); // Wir fügen das erste Label in den ersten Abschnitt des vbox ein
Gtk::HBox * hbox = new Gtk::HBox; // Neues Box objekt ( Horizontal (wer hätte das gedacht ? ;) ) )
vbox->pack_start( *Gtk::manage( hbox )); // Nun übergeben wir das HBox und sorgen, wie wir das beim VBox auch getan haben dafür dass user Objekt automatisch gelöscht wird
hbox->pack_start( m_labels[ MW_Label2 ] ); // Nun fügen wir das 2te Label noch hinzu
hbox->pack_start( m_edit ); // Nun noch das Editfeld / Entry
hbox->set_spacing( 15 );
vbox->pack_start( m_ok_button ); // Und den natürlich dann den button Button
// Nun setzen wir den Text der Labels
m_labels[MW_Label1].set_text(Glib::locale_to_utf8("Gib nen Text ein und klick OK!"));
m_labels[MW_Label2].set_text(Glib::locale_to_utf8("Text eingeben: "));
// Wir setzen die Callback Methode für das click signal
m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));
// Alle Widgets anzeigen
show_all();
}
void MyWindow::on_button_ok_clicked()
{
// Wir lesen den Text vom Entry und übergeben diesen an das Label
m_labels[MW_Label1].set_text( m_edit.get_text());
}
set_title(Glib::locale_to_utf8("gtkmm Beispiel 2")); // Setzen des Fenstertitels
Gtk::VBox * vbox = new Gtk::VBox; // Wir erstellen eine Vertikale Box für unsere widgets
add(*Gtk::manage(vbox)); // Wir übergeben die VBox an unser Fenster und sorgen dafür das es automatisch gelöscht wird
vbox->set_homogeneous(true); // für gleichmässigkeit sorgen
vbox->set_spacing( 10 ); // Platzzwischen den Elementen des VBoxes
vbox->set_border_width( 10 ); // Randbreite auf 10 Pixel setzen
vbox->pack_start( m_labels[ MW_Label1 ],true,true); // Wir fügen das erste Label in den ersten Abschnitt des vbox ein
Gtk::HBox * hbox = new Gtk::HBox; // Neues Box objekt ( Horizontal (wer hätte das gedacht ? ;) ) )
vbox->pack_start( *Gtk::manage( hbox )); // Nun übergeben wir das HBox und sorgen, wie wir das beim VBox auch getan haben dafür dass user Objekt automatisch gelöscht wird
hbox->pack_start( m_labels[ MW_Label2 ] ); // Nun fügen wir das 2te Label noch hinzu
hbox->pack_start( m_edit ); // Nun noch das Editfeld / Entry
hbox->set_spacing( 15 );
vbox->pack_start( m_ok_button ); // Und den natürlich dann den button Button
// Nun setzen wir den Text der Labels
m_labels[MW_Label1].set_text(Glib::locale_to_utf8("Gib nen Text ein und klick OK!"));
m_labels[MW_Label2].set_text(Glib::locale_to_utf8("Text eingeben: "));
// Wir setzen die Callback Methode für das click signal
m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));
// Alle Widgets anzeigen
show_all();
}
void MyWindow::on_button_ok_clicked()
{
// Wir lesen den Text vom Entry und übergeben diesen an das Label
m_labels[MW_Label1].set_text( m_edit.get_text());
}
So und zu guter letzt das ganze Programm incl. main()
Das stimmt zwar einerseits, aber andererseits passiert mir bei GUI-Code immer genau das: der Code wird häßlich.
Ist es also generell so: GUI-Code muß häßlich sein?
Oder kann man das auch schön machen? Wenn ja, dann wäre es schön, wenn Du auch das zeigen könntest. Gehört nämlich irgendwie schon dazu. Außerdem denke ich, daß viele Leute Schwierigkeiten haben ihre GUI Code-mäßig sauber zu strukturieren.
Btw.: Schönes "Tutorial"
_________________ Mod im Mathe-Forum
Die dümmsten Programmierer schreiben die dicksten Programme.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.