2013-11-20 38 views
1

我有一個問題:我可以使用GTKMM中的UIManager類創建菜單,但我不知道如何在運行時修改(編輯或刪除項目)。我發現了一些gnome開發者網站的例子,但是他們都沒有解決我的問題。我發現this網站,但它對我沒有幫助,因爲我沒有完整的源代碼來學習。如果有人可以發佈一個完整的源代碼,或者提及其他解決方案,那就沒問題了。我使用的是C++(gcc)和Ubuntu 13.10。 PS:對不起,我的語法不好。使用GTKMM和UIManager創建動態菜單

回答

1

我建議不要試圖使用UIManger作爲動態菜單,只能使用UIManager作爲靜態菜單。如果你想創建一個動態菜單這裏是做這件事:

#include <gtkmm.h> 

class MainWindow : public Gtk::Window 
{ 
public: 
    MainWindow(); 
    virtual ~MainWindow(); 
    void newTab(); 

protected: 
    void buttonAddClicked(); 
    void buttonDeleteClicked(); 

    Gtk::Box box_; 
    Gtk::MenuItem* item; 
    Gtk::Menu* submenu1; 
    Gtk::MenuItem* subitem1; 
    Gtk::MenuItem* item2; 
    Gtk::Menu* submenu2; 
    Gtk::MenuItem* subitem2; 
    Gtk::ButtonBox buttonbox_; 
    Gtk::Button button_delete_; 
    Gtk::Button button_add_; 
}; 

MainWindow::MainWindow() 
{ 
    this->set_title("Menu Test"); 
    this->set_default_size(300, 400); 
    box_.set_orientation(Gtk::ORIENTATION_VERTICAL); 
    this->add(box_); 

    item = Gtk::manage(new Gtk::MenuItem("test")); 
    submenu1 = Gtk::manage(new Gtk::Menu); 
    subitem1 = Gtk::manage(new Gtk::MenuItem("sub Item")); 
    submenu1->append(*subitem1); 
    item->set_submenu(*submenu1); 
    item2 = Gtk::manage(new Gtk::MenuItem("test2")); 
    submenu2 = Gtk::manage(new Gtk::Menu); 
    subitem2 = Gtk::manage(new Gtk::MenuItem("sub item 2")); 
    submenu2->append(*subitem2); 
    item2->set_submenu(*submenu2); 
    Gtk::MenuBar* menubar = Gtk::manage(new Gtk::MenuBar); 
    //nmenu->append(*item); 
    menubar->append(*item); 
    menubar->append(*item2); 
    box_.add(*menubar); 

    button_delete_.set_label("Delete"); 
    button_add_.set_label("Add"); 
    box_.add(buttonbox_); 
    buttonbox_.add(button_delete_); 
    buttonbox_.add(button_add_); 

    button_delete_.signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::buttonDeleteClicked)); 
    button_add_.signal_clicked().connect(sigc::mem_fun(*this, &MainWindow::buttonAddClicked)); 

    this->show_all_children(); 
} 

MainWindow::~MainWindow() 
{ 

} 

void MainWindow::buttonAddClicked() 
{ 
    Gtk::MenuItem* newitem = Gtk::manage(new Gtk::MenuItem("new Item")); 
    submenu1->append(*newitem); 
    newitem->show_all(); 
} 

void MainWindow::buttonDeleteClicked() 
{ 
    subitem2->hide(); 
} 

int main(int argc, char** argv) 
{ 
    Glib::RefPtr<Gtk::Application> app = Gtk::Application::create(argc, argv, "menu.example"); 

    MainWindow mw; 

    app->run(mw); 

    return 0; 
} 

正如你看到它是不是很難創建一個gtkmm的常規菜單。這與使用UIManager幾乎相同。如果這個例子不適合你,你可以嘗試使用GtkBuiler而不是UIManager。 GtkBuilder更易於使用,更友好。