Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: FAQ - GUIs ::  gtkmm Beispiel Programm Pt. 2     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
evilissimo
Chefkoch

Benutzerprofil
Anmeldungsdatum: 12.11.2003
Beiträge: 2281
Beitrag evilissimo Chefkoch 02:36:30 21.06.2005   Titel:   gtkmm Beispiel Programm Pt. 2            Zitieren

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++:
#include <gtkmm.h> // Bindet alles was man für gtkmm braucht ein (Braucht dann alles auch länger beim kompilieren


C++:
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.
C++:
MyWindow::MyWindow()
: m_ok_button(Gtk::Stock::OK)
{



C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  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()
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <gtkmm.h>
struct MyWindow : public Gtk::Window
{
  MyWindow();
  Gtk::Button m_ok_button;
  Gtk::Entry   m_edit;
  Gtk::Label  m_labels[2];
  enum { MW_Label1 , MW_Label2 };
 
  void on_button_ok_clicked();
};
 
int main(int argc, char**argv)
{
  Gtk::Main main_obj(argc,argv);
 
  MyWindow window_obj;
 
  main_obj.run(window_obj);
 
  return EXIT_SUCCESS;  
}
 
MyWindow::MyWindow()
: m_ok_button(Gtk::Stock::OK)
{
  set_title(Glib::locale_to_utf8("gtkmm Beispiel 2"));
  Gtk::VBox * vbox = new Gtk::VBox;        
  add(*Gtk::manage(vbox));                  
  vbox->set_homogeneous(true);
  vbox->set_spacing( 10 );
  vbox->set_border_width( 10 );
  vbox->pack_start( m_labels[ MW_Label1 ],true,true);
  Gtk::HBox * hbox = new Gtk::HBox;
  vbox->pack_start( *Gtk::manage( hbox ));  
  hbox->pack_start( m_labels[ MW_Label2 ] );
  hbox->pack_start( m_edit );
  hbox->set_spacing( 15 );
  vbox->pack_start( m_ok_button );  
  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: "));
  m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));  
  show_all();
}
 
void MyWindow::on_button_ok_clicked()
{
  m_labels[MW_Label1].set_text( m_edit.get_text());
}




Fragen,Anregungen und/oder Verbesserungsvorschläge erwünscht !

MfG until next part :cool:

PS: Hier geht es 1. nicht um den Codingstyle und 2. auch nicht um die möglichst kürzeste lösung, wollt ich nur mal anmerken!

_________________
evilissimo - R.I.P. dmr
< Moderator im C++/CLI Forum und im C++ Forum >
About Singletons: "Anyway, if our experts can make this mistake, you have made it and you don't even know about it."


Zuletzt bearbeitet von evilissimo am 04:17:51 21.06.2005, insgesamt 4-mal bearbeitet
Werbeunterbrechung
evilissimo
Chefkoch

Benutzerprofil
Anmeldungsdatum: 12.11.2003
Beiträge: 2281
Beitrag evilissimo Chefkoch 03:16:00 21.06.2005   Titel:              Zitieren

Hier noch einmal das gleiche in einer reduzierten Form. mit 41 Zeilen

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <gtkmm.h>
struct MyWindow : public Gtk::Window
{
  MyWindow();
  Gtk::Button m_ok_button;
  Gtk::VBox   m_vbox;
  Gtk::HBox   m_hbox;
  Gtk::Entry  m_edit;
  Gtk::Label  m_labels[2];
  enum { MW_Label1 , MW_Label2 };
  void on_button_ok_clicked();
};
int main(int argc, char**argv)
{
  Gtk::Main main_obj(argc,argv);
  MyWindow window_obj;
  main_obj.run(window_obj);
  return EXIT_SUCCESS;  
}
MyWindow::MyWindow()
: m_ok_button(Gtk::Stock::OK),
  m_vbox(true  , 10),
  m_hbox(false , 15)
{
  set_title(Glib::locale_to_utf8("gtkmm Beispiel 2"));
  add(m_vbox);                  
  m_vbox.set_border_width( 10 );
  m_vbox.pack_start( m_labels[ MW_Label1 ],true,true);
  m_vbox.pack_start( m_hbox );  
  m_hbox.pack_start( m_labels[ MW_Label2 ] );
  m_hbox.pack_start( m_edit );
  m_vbox.pack_start( m_ok_button );  
  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: "));
  m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));  
  show_all();
}
void MyWindow::on_button_ok_clicked()
{
  m_labels[MW_Label1].set_text( m_edit.get_text());
}

_________________
evilissimo - R.I.P. dmr
< Moderator im C++/CLI Forum und im C++ Forum >
About Singletons: "Anyway, if our experts can make this mistake, you have made it and you don't even know about it."
Jester
Moderator

Benutzerprofil
Anmeldungsdatum: 06.04.2001
Beiträge: 8521
Beitrag Jester Moderator 10:08:18 21.06.2005   Titel:   Re: gtkmm Beispiel Programm Pt. 2            Zitieren

eViLiSSiMo schrieb:

PS: Hier geht es 1. nicht um den Codingstyle


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" :leak:

_________________
Mod im Mathe-Forum

Die dümmsten Programmierer schreiben die dicksten Programme.
evilissimo
Chefkoch

Benutzerprofil
Anmeldungsdatum: 12.11.2003
Beiträge: 2281
Beitrag evilissimo Chefkoch 10:28:33 21.06.2005   Titel:              Zitieren

Also viel besser als das so zumachen, geht es kaum. ( Zumindest nicht ohne libglademm )

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <gtkmm.h>
 
struct MyWindow : public Gtk::Window
{
  MyWindow();
  void on_button_ok_clicked();
  private:
  // Widgets
  Gtk::Button m_ok_button;
  Gtk::VBox   m_vbox;
  Gtk::HBox   m_hbox;
  Gtk::Entry  m_edit;
  Gtk::Label  m_labels[2];
 
  enum { MW_Label1 , MW_Label2 };
 
  // Setup Methoden
  void setup_vbox();
  void setup_hbox();
 
  void set_label_text( unsigned label , Glib::ustring const & text , bool to_utf8 = false );
};
 
 
int main(int argc, char**argv)
{
  Gtk::Main main_obj(argc,argv);
  MyWindow window_obj;
  main_obj.run(window_obj);
  return EXIT_SUCCESS;  
}
 
 
MyWindow::MyWindow()
: m_ok_button(Gtk::Stock::OK),
  m_vbox(true  , 10),
  m_hbox(false , 15)
{  
  set_title(Glib::locale_to_utf8("gtkmm Beispiel 2"));
 
  setup_vbox();
  setup_hbox();
 
  m_ok_button.signal_clicked().connect( sigc::mem_fun(*this,&MyWindow::on_button_ok_clicked));  
 
  show_all();
}
 
void MyWindow::on_button_ok_clicked()
{
  set_label_text( MW_Label1 , m_edit.get_text());
}
 
void MyWindow::setup_vbox()
{
  add(m_vbox);                  
  m_vbox.set_border_width( 10 );
  m_vbox.pack_start( m_labels[ MW_Label1 ],true,true);
  set_label_text(MW_Label1,"Gib nen Text ein und klick OK!",true);
  m_vbox.pack_start( m_hbox );  
  m_vbox.pack_start( m_ok_button );  
}
 
void MyWindow::setup_hbox()
{
  m_hbox.pack_start( m_labels[ MW_Label2 ] );
  m_hbox.pack_start( m_edit );
  set_label_text(MW_Label2,"Text eingeben: ",true);
}
 
void MyWindow::set_label_text( unsigned label , Glib::ustring const & text , bool to_utf8 )
{
  if(to_utf8)
     m_labels[label].set_text(text);
  else
     m_labels[label].set_text(Glib::locale_to_utf8(text));
}


BR

_________________
evilissimo - R.I.P. dmr
< Moderator im C++/CLI Forum und im C++ Forum >
About Singletons: "Anyway, if our experts can make this mistake, you have made it and you don't even know about it."
c++.de :: FAQ - GUIs ::  gtkmm Beispiel Programm Pt. 2   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

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 und www.c-plusplus.net 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.