2017-01-10 9 views
0

Я пытаюсь написать программу в gtkmm, но кнопки не будут отображаться. Я сделал все, что знаю, чтобы показать эти кнопки, но ничего не работает. Я даже включил методы «показать все» в основном файле и в файле win_home.cpp, но все равно ничего не происходит. Тем не менее, программа выполняет код, поскольку все сообщения cout печатаются. Кто-нибудь знает, почему эти кнопки не появятся?Программа в gtkmm не будет показывать кнопки

main.cpp:

#include <gtkmm.h> 
#include <iostream> 
#include "win_home.h" 

int main(int argc, char *argv[]) 
{ 
    auto app = Gtk::Application::create(argc, argv, "com.InIT.InITPortal"); 

    std::cout << "Creating Portal Window" << std::endl; 
    HomeGUI win_home; 

    win_home.set_default_size(600,400); 
    win_home.set_title("St. George InIT Home"); 

    return app->run(win_home); 
} 

win_home.cpp:

#include "win_home.h" 

HomeGUI::HomeGUI() 
{ 
    //build interface/gui 
    this->buildInterface(); 
    //show_all_children(); 

    //register Handlers 
    //this->registerHandlers(); 
} 
HomeGUI::~HomeGUI() 
{ 

} 

void HomeGUI::buildInterface() 
{ 

    std::cout << "Building Portal Interface" << std::endl; 
    m_portal_rowbox = Gtk::Box(Gtk::ORIENTATION_HORIZONTAL, 5); 
    add(m_portal_rowbox); 
     Gtk::Button m_pia_button = Gtk::Button("Printer Install Assistant"); 
      m_portal_rowbox.pack_start(m_pia_button, false, false, 0); 
      m_pia_button.show(); 
     Gtk::Button m_inventory_button = Gtk::Button("Inventory"); 
     m_inventory_button.show(); 
      m_portal_rowbox.pack_start(m_inventory_button, false, false, 0); 
      m_inventory_button.show(); 

    //add(m_portal_rowbox); 
    //m_portal_rowbox.show_all(); 
    m_portal_rowbox.show(); 
    this->show_all_children(); 
    std::cout << "Completed Portal Interface" << std::endl; 

    return; 
} 

void HomeGUI::registerHandlers() 
{ 

} 
+0

К сожалению, у меня нет опыта работы в C++ (я использую python). Все-таки вы добавляете свой GtkBox в окно? Это сбило меня с толку в прошлом, когда один «виджет» не был добавлен в родительский виджет. – theGtknerd

+0

@theGtknerd - это строка 'add (m_portal_rowbox);'. – andlabs

+0

'Gtk :: Button x = Gtk :: Button (' выглядит подозрительно для меня. Что произойдет, если вы замените их с помощью кнопки Gtk :: Button x (', и сделайте то же самое для GtkBox? – andlabs

ответ

1

В ничтожной HomeGUI::buildInterface() вы построили 2 кнопки, и они добавили его в свой ящик контейнера. Когда функция возвращает кнопки, они уничтожаются, поскольку они теперь выходят за рамки. Поскольку они больше не существуют, они не могут быть видны.

Так что для вас первой кнопки вы бы использовать что-то вроде этого:

Gtk::Button * m_pia_button = Gtk::manage(
    new Gtk::Button("Printer Install Assistant")); 
m_portal_rowbox.pack_start(&m_pia_button, false, false, 0); 
    m_pia_button.show(); 

Я ожидаю, что вам нужно будет легкий доступ к кнопкам на протяжении всего срока службы вашего окна. Самый простой способ - использовать кнопки в качестве члена вашего класса. Он будет создан как пустая кнопка, и вам просто нужно будет установить ярлык позже.

class HomeGUI { 
    .... 
    // A button (empty) 
    Gtk::Button m_pia_button; 
    .... 
}; 
.... 
void HomeGUI::buildInterface() 
{ 
    .... 
    m_pia_button.set_label("Printer Install Assistant"); 
    m_portal_rowbox.pack_start(m_pia_button, false, false, 0); 
     m_pia_button.show(); 
    .... 
} 
+0

Я предполагаю, что я просто был тупым. Я пытался повторно инициализировать мои переменные-члены в buildInterface(), как я уже объявил их в своем заголовочном файле. Спасибо! – TheEggSample