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

Gtkmm 3.0 How to switch between frames or windows

本文关键字:窗口 之间 框架 Gtkmm      更新时间:2023-10-16

我对C++相当陌生,我对Java中的MCV编程有一些经验。im在C上使用GTKmm++我想做的是编写一份申请,让助教向各个职位提交和编辑申请,让管理员参与进来并接受这些申请。

我想做的是创建3个"框架"(我现在只为学生提交申请)

  • 如果你是学生/管理员,第一个将有2个按钮1可供选择

  • 点击后,你是一个学生,我想隐藏这个帧,并显示我的第二帧

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

我的核心问题是,我不明白如何在框架之间切换,我已经为我的模型编写了所有的代码,并且理解我想让它做的一切,但我似乎找不到如何做到这一点。。。

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

我想我可以为任何版本>=GTK+3.10建议一个更好/更惯用的选项,公平地说,它是在接受答案大约半年后出现的。

如果你想在没有任何附件(如标签)的情况下一次一个地在小部件之间切换,那么Gtk::Stack似乎是一个更好的选择。因为它是专门为一次一个演示而设计的,没有Notebook的手动选项卡功能带来的任何冗余和(理论上的)开销,而您只需要立即禁用这些功能!它是一个包含多个子项的容器,其中一个子项在任何给定时刻都可见,当然还有更改活动子项的方法。

您可以挂接自己的小部件和/或事件来管理显示了Stack的哪些子级。或者,尽管在这种情况下可能只是恢复冗余,但有一个StackSwitcher配套小部件,它几乎是一个垂直的选项卡栏,如GTK+演示和GNOME调整工具中所示。

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

使用信号使一个页面上的小部件(例如"我是学生"按钮)做一些事情(例如转到第二页)。如果你不知道这意味着什么或如何做到这一点,请阅读gtkmm教程,它将解释这一点以及更多内容。

太晚了!但这是我的尝试:

Gtk::Notebook很好,但在点击菜单项时在应用程序框架之间切换并不理想。Gtk::Stack,自gtkmm 3.10以来,其存在是为了缓解这种情况。假设您使用的是gladeGtk::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));
}

我们的回调

void AppName::on_mb_itemname_selected()
{
// Change the visible child of the stack concerned.
Gtk::StackTransitionType ttype = STACK_TRANSITION_TYPE_NONE;
_app_stack->set_visible_child("your_widget_name",ttype);
// Note that widget name is not widget glade id.
// You can set  your widget under name Packing -> Name
return; 
}