Gtkmm 3.0如何在框架或窗口之间切换

时间:2013-02-10 01:32:18

标签: c++ user-interface gtk gtkmm

我是C ++的新手,我对使用Java进行MCV编程有一些经验。我在C ++上使用GTKmm 我正在尝试做的是为教学助理编写一份申请,向各种职位提交和编辑申请,并让管理人员进入,并接受这些申请。

我在乞讨时尝试做的是制作3'框架' (我现在正在为学生提交申请)

  • 第一个将有2个按钮1,用于选择您是否为学生/管理员

  • 点击你后,我想隐藏这个框架并显示我的第二帧

  • 第二帧将有另外两个按钮,一个用于创建应用程序,另一个用于编辑应用程序

我的核心问题是,我不了解如何在帧之间切换,我已经为我的模型编写了所有代码,并了解了我想要它做的所有事情但是我似乎无法找到如何这样做......

我唯一的想法是为每个创建窗口,让它们看起来都很好w / e,然后当按下按钮时关闭该窗口并写入文件的字符串我可以访问以查看哪个按钮已经按下,然后相应地打开一个新窗口。我应该这样做还是有更好的方法?

3 个答案:

答案 0 :(得分:3)

我认为我可以为任何版本> = GTK + 3.10建议一个更好/更惯用的选项 - 这是公平的,在接受答案后半年左右到达。

如果您希望一次一个地在小部件之间切换而不使用任何附件,例如标签,那么Gtk::Stack似乎是更好的选择。因为它专门针对一次一次演示,没有任何冗余和(理论)开销来自Notebook的手动标签功能,您只需立即禁用!它是一个有多个孩子的容器,在任何给定的时刻都可以看到,当然还有改变活跃孩子的方法。

您可以连接自己的小部件和/或事件来管理显示Stack个孩子的哪个。或者 - 尽管可能只是在这种情况下恢复冗余 - 有一个StackSwitcher伴随窗口小部件,它几乎是一个垂直标签栏,如GTK +演示和GNOME调整工具中所示。

答案 1 :(得分:1)

最简单的方法是使用Notebook小部件。您可以使用方法set_show_tabs(false)隐藏选项卡,因为您将控制显示哪个页面。使用方法append_page()将每个框架的顶级窗口小部件放在窗格中,然后使用set_current_page()在它们之间切换。您可能希望使用方法set_show_bevel(false)隐藏笔记本的斜面,如果它分散注意力的话。

使用信号在一个页面上制作小部件(例如“我是学生”按钮)做某事(例如,转到第二页)。如果您不知道这意味着什么或如何做,请通过gtkmm tutorial,它将解释这一点以及更多。

答案 2 :(得分:0)

为时已晚!但是,这是我的尝试:

nuget locals all -list 很棒,但是在菜单项单击上的应用程序框架之间切换时并不理想。自gtkmm 3.10起,Gtk::Notebook可以缓解这一问题。假设您使用的是Gtk::Stackglade

课程

Gtk::Builder

构造函数

class AppName : public Gtk::ApplicationWindow
{
public:
//...Your app methods and callbacks
void on_mb_itemname_selected(); // The call back for our menu item click/select
private:
//Builder which will help build the app from a .glade file
Glib::RefPtr<Gtk::Builder> _builder;
//...
//Your menu item to activate a particular frame
Gtk::MenuItem * _mb_itemname;
//Your handle to Gtk::Stack which is usually the stack for the whole app
 Gtk::Stack * _app_stack;
//...
}

我们的回叫

AppName::AppName(BaseObjectType *cobj,
                 Glib::RefPtr<Gtk::Builder>& ref_builder)
                :Gtk::ApplicationWindow(cobj),_builder(ref_builder)
{
//.. Other setup
_builder->get_widget("your_glade_id_to_stack",_app_stack);
_builder->get_widget("your_glade_id_to_menu_item",_mb_itemname);

// Connect signal_select of our menu item to appropriate signal handler.
mb_itemname->signal_select().connect(
          sigc::mem_fun(*this,&AppName::on_mb_itemname_selected));
}