2016-04-16 8 views
1

Ich bin noch neu in der Verwendung von Widget Toolkits, aber ich denke wirklich, das sollte funktionieren. Ich habe diesen Code von developer.gnome.org kopiert und der Klasse Buttons ein eigenes Objekt (button2) hinzugefügt, aber nur das Original m_button wird im Fenster angezeigt. Der Inhalt buttons.h:Kann in gtkmm nicht mehrere Schaltflächen zum Fenster hinzufügen?

#ifndef GTKMM_EXAMPLE_BUTTONS_H 
    #define GTKMM_EXAMPLE_BUTTONS_H 

    #include <gtkmm/window.h> 
    #include <gtkmm/button.h> 

    class Buttons : public Gtk::Window 
    { 
    public: 
     Buttons() 
     { 
     m_button.add_pixlabel("info.xpm", "hi"); 
     button2.add_pixlabel("info.xpm", "hello"); 

     set_title("Pixmap'd buttons!"); 
     set_border_width(10); 

     m_button.signal_clicked().connect(sigc::mem_fun(*this, 
      &Buttons::on_button_clicked)); 

     add(button2); 
     add(m_button); 

     show_all_children(); 
     } 

     virtual ~Buttons() 
     { 
     } 

    protected: 
     //Signal handlers: 
     void on_button_clicked() 
     { 
     } 

     //Child widgets: 
     Gtk::Button button2; 
     Gtk::Button m_button; 
     }; 

     #endif //GTKMM_EXAMPLE_BUTTONS_H 

Inhalt main.cpp:

#include "buttons.h" 
    #include <gtkmm/application.h> 

    int main(int argc, char *argv[]) 
    { 
    Glib::RefPtr<Gtk::Application> app = 
    Gtk::Application::create(argc, argv, 
    "org.gtkmm.examples.base"); 

    Buttons buttons; 

    return app->run(buttons); 
    } 

Antwort

3

Ich bin derzeit auch Gtkmm Lernen, so könnte dies nicht die beste Antwort sein, aber ich denke, dass die richtigen So würde man Gtk :: Box Objekt hinzufügen und dann Gtk :: Buttons zur Gtk :: Box hinzufügen

So habe ich es gemacht. Ich habe auch die Kopfzeile gtkmm_example_buttons.h in gtkmm_example_buttons.hpp und gtkmm_example_buttons.cpp aufgeteilt. Außerdem habe ich den Button-Namen m_button in button1 geändert, um den button2-Namen aufgrund der Konsistenz zu finden.

//gtkmm_example_buttons.hpp 
#pragma once //used instead of the ifdef 

#include <gtkmm/window.h> 
#include <gtkmm/button.h> 
#include <gtkmm/box.h> 

class Buttons : public Gtk::Window 
{ 
public: 
Buttons(); 
virtual ~Buttons(); 

protected: 
void on_button_clicked(); 
Gtk::Button button1, button2; 
Gtk::Box box1; 
}; 

Auch ich habe Signalbehandlung entfernt, weil sie Code nur komplizierter machen würden. Sie werden später mehr darüber erfahren.

//gtkmm_example_buttons.cpp 
#include "gtkmm_example_buttons.hpp" 
#include <gtkmm/window.h> 
#include <gtkmm/button.h> 
#include <gtkmm/box.h> 

Buttons::Buttons() 
{ 
button1.add_pixlabel("info.xpm", "hi"); 
button2.add_pixlabel("info.xpm", "hello"); 

set_title("Pixmap'd buttons!"); 
set_border_width(10); 
add(box1); 

box1.pack_start(button1); 
box1.pack_start(button2); 

show_all_children(); 
} 

Buttons::~Buttons() 
{ 
} 

void Buttons::on_button_clicked() 
{ 
} 

Und Haupt:

//main.cpp 
#include "gtkmm_example_buttons.hpp" 
#include <gtkmm.h> 

int main (int argc, char *argv[]) 
{ 
auto app = Gtk::Application::create(argc, argv, "org.gtkmm.test"); 
//Shows the window and returns when it is closed. 

Buttons buttons; 
return app->run(buttons); 
} 
+0

Dank, das funktioniert. – Vincent

+0

Dies ist die richtige Antwort, da Widgets nicht direkt in ein Fenster eingefügt werden sollen. Wenn Sie zwei Widgets hinzufügen, weiß ich nicht, was passiert, aber ich denke, Ihre Tasten wurden möglicherweise übereinander gestapelt. Verwenden Sie immer Boxen für das Widget-Layout. – oldtechaa

+1

Richtig, ein GtkWindow kann nur ein Kind halten. (Unterklassen von GtkBin können nur ein Kind enthalten.) Verwenden Sie die Layout-Widgets wie GtkBox und GtkGrid, um mehrere Widgets zu erstellen. – andlabs