1

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

PS:对不起我的语法。

4

1 回答 1

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 更容易使用,也更友好。

于 2013-12-09T22:00:00.377 回答