使用GTKMM和UIManager创建动态菜单

时间:2013-11-20 14:53:35

标签: dynamic menu gtkmm uimanager

我遇到问题:我可以在GTKMM中使用UIManager类创建菜单,但我不知道如何在运行时修改(编辑或删除项目)。我找到了一些gnome开发者网站的例子,但没有一个能解决我的问题。我找到了this网站,但它对我没有帮助,因为我没有完整的源代码可供学习。如果有人可以发布完整的源代码或提及其他解决方案,那就没问题了。我正在使用C ++(gcc)和Ubuntu 13.10。

PS:对不起我的语法。

1 个答案:

答案 0 :(得分: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更易于使用,更友好。