2017-01-16 7 views
1

Я создал ноутбук с библиотекой gtkmm, но я не могу открыть некоторые новые вкладки. Это мой код:Как открыть новую вкладку с помощью Gtkmm?

Существует три файла:

main.cpp

#include <gtkmm/main.h> 
#include "win.hpp" 

int main(int argc, char *argv[]){ 
Gtk::Main app(argc, argv); 
Win win; 
Gtk::Main::run(win); 
return EXIT_SUCCESS; 
} 

win.hpp:

#ifndef DEF_WIN 
#define DEF_WIN 

#include <gtkmm.h> 
#include <iostream> 
#include <iomanip> 
#include <string> 
#include <fstream> 
#include <ctime> 
#include <cstdlib> 
#include <sstream> 

class Win : public Gtk::Window{ 
public: 
Win(); 
private: 
Gtk::Notebook m_notebook; 
Gtk::Grid m_grid1; 
Gtk::Grid m_grid2; 
}; 
#endif 

И это последний файл:

#include "win.hpp" 


Win::Win(){ 


    maximize(); 
    set_title("Test"); 


    Gtk::VBox *boxV = Gtk::manage(new Gtk::VBox(false,0)); 
    add(*boxV); 


    Gtk::MenuBar *barreMenu = Gtk::manage(new Gtk::MenuBar); 
    boxV->pack_start(*barreMenu, Gtk::PACK_SHRINK); 

    Gtk::MenuItem *menuItemFile = Gtk::manage(new Gtk::MenuItem("_File",true)); 
    barreMenu->append(*menuItemFile); 
    Gtk::Menu *menuFile = Gtk::manage(new Gtk::Menu); 
    menuItemFile->set_submenu(*menuFile); 
    Gtk::ImageMenuItem *menuNew = Gtk::manage(new Gtk::ImageMenuItem(Gtk::Stock::NEW)); 
    menuFile->append(*menuNew); 
    menuNew->signal_activate().connect([this]() { 
m_notebook.append_page(m_grid1,"Hello"); 
     }); 




    m_notebook.popup_enable(); 



    Gtk::Grid* grid1 = Gtk::manage(new Gtk::Grid()); 


    grid1->set_border_width(0); 
    grid1->set_row_spacing(0); 

    Gtk::Label *title = Gtk::manage(new Gtk::Label()); 
    title->set_markup("<b><span size='xx-large'>Welcome !"); 
    title->set_hexpand(true); 
    grid1->attach(*title,0,0,10,1); 





    Gtk::Button *commencer = Gtk::manage(new Gtk::Button("Start")); 
    grid1->attach(*commencer,4,7,2,3); 
    commencer->set_hexpand(true); 
    commencer->signal_clicked().connect([this]() { 
    m_notebook.append_page(m_grid2,"Hey"); 
    }); 


    m_notebook.append_page(*grid1, "New worksheet"); 
    boxV->pack_start(m_notebook); 


show_all(); 
} 

Код компилируется withou никаких проблем. Но когда я выполняю код и нажмите Start или Новый я не получаю никаких новых вкладок, и я не знаю, почему, потому что я вкладываю в сигнал этого:

m_notebook.append_page(m_grid1,"Hello"); 

, а также это:

m_notebook.append_page(m_grid2,"Hey"); 

ответ

0

Каждый виджет должен быть shown после создания.

*grid1 показан с window.show_all(), но в момент выполнения этого метода m_grid1 и m_grid2 не имеют родителя и не в иерархии window «ы.

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

int main() 
{ 
    auto Application = Gtk::Application::create(); 
    Gtk::Window window; 
    window.maximize(); 
    window.set_title("Test"); 

    Gtk::Grid m_grid1, m_grid2; 

    Gtk::VBox *boxV = Gtk::manage(new Gtk::VBox(false,0)); 
    window.add(*boxV); 

    Gtk::MenuBar *barreMenu = Gtk::manage(new Gtk::MenuBar); 
    boxV->pack_start(*barreMenu, Gtk::PACK_SHRINK); 

    Gtk::MenuItem *menuItemFile = Gtk::manage(new Gtk::MenuItem("_File",true)); 
    barreMenu->append(*menuItemFile); 
    Gtk::Menu *menuFile = Gtk::manage(new Gtk::Menu); 
    menuItemFile->set_submenu(*menuFile); 
    Gtk::ImageMenuItem *menuNew = Gtk::manage(new Gtk::ImageMenuItem(Gtk::Stock::NEW)); 
    menuFile->append(*menuNew); 

    Gtk::Notebook m_notebook; 
    menuNew->signal_activate().connect([&]() { 
      m_notebook.append_page(m_grid1,"Hello"); 
      m_grid1.show(); 
     }); 

    m_notebook.popup_enable(); 

    Gtk::Grid* grid1 = Gtk::manage(new Gtk::Grid()); 

    grid1->set_border_width(0); 
    grid1->set_row_spacing(0); 

    Gtk::Label *title = Gtk::manage(new Gtk::Label()); 
    title->set_markup("<b><span size='xx-large'>Welcome !</span></b>"); 
    title->set_hexpand(true); 
    grid1->attach(*title,0,0,10,1); 

    Gtk::Button *commencer = Gtk::manage(new Gtk::Button("Start")); 
    grid1->attach(*commencer,4,7,2,3); 
    commencer->set_hexpand(true); 
    commencer->signal_clicked().connect([&]{ 
      m_notebook.append_page(m_grid2,"Hey"); 
      m_grid2.show(); 
     }); 

    m_notebook.append_page(*grid1, "New worksheet"); 
    boxV->pack_start(m_notebook); 

    window.show_all(); 

    Application->run(window); 
    return 0; 
} 

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

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

int main() 
{ 
    auto Application = Gtk::Application::create(); 
    Gtk::Window window; 
    window.maximize(); 
    window.set_title("Test"); 

    Gtk::Grid m_grid1, m_grid2; 
    Gtk::Notebook m_notebook; 

    auto addGrid = [&]{ 
     Gtk::Grid* grid1 = Gtk::manage(new Gtk::Grid()); 
     Gtk::Label *title = Gtk::manage(new Gtk::Label("Welcome 2")); 
     grid1->attach(*title,0,0,10,1); 
     m_notebook.append_page(*grid1,"Hello"); 
     grid1->show(); 
    }; 

    Gtk::VBox *boxV = Gtk::manage(new Gtk::VBox(false,0)); 
    window.add(*boxV); 

    Gtk::MenuBar *barreMenu = Gtk::manage(new Gtk::MenuBar); 
    boxV->pack_start(*barreMenu, Gtk::PACK_SHRINK); 

    Gtk::MenuItem *menuItemFile = Gtk::manage(new Gtk::MenuItem("_File",true)); 
    barreMenu->append(*menuItemFile); 
    Gtk::Menu *menuFile = Gtk::manage(new Gtk::Menu); 
    menuItemFile->set_submenu(*menuFile); 
    Gtk::ImageMenuItem *menuNew = Gtk::manage(new Gtk::ImageMenuItem(Gtk::Stock::NEW)); 
    menuFile->append(*menuNew); 

    menuNew->signal_activate().connect(addGrid); 

    m_notebook.popup_enable(); 

    m_grid1.set_border_width(0); 
    m_grid1.set_row_spacing(0); 

    Gtk::Label *title = Gtk::manage(new Gtk::Label()); 
    title->set_markup("<b><span size='xx-large'>Welcome !</span></b>"); 
    title->set_hexpand(true); 
    m_grid1.attach(*title,0,0,10,1); 

    Gtk::Button *commencer = Gtk::manage(new Gtk::Button("Start")); 
    m_grid1.attach(*commencer,4,7,2,3); 
    commencer->set_hexpand(true); 
    commencer->signal_clicked().connect(addGrid); 

    m_notebook.append_page(m_grid1, "New worksheet"); 
    boxV->pack_start(m_notebook); 

    window.show_all(); 

    Application->run(window); 
    return 0; 
}