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

问题描述 投票:1回答:3

我对C ++很新,我对Java中的MCV编程有一些经验。我在C ++上使用GTKmm我正在尝试做的是编写一个教学助理应用程序,以提交和编辑各种职位的应用程序,管理员进入视野,并接受这些应用程序。

我一开始要做的就是创建3个'框架'(我现在正在为学生提交申请)

  • 第一个将有2个按钮1,用于选择您是学生/管理员
  • 点击你是学生我想隐藏这个框架并显示我的第二帧
  • 第二帧将有另外两个按钮,一个用于创建应用程序,另一个用于编辑应用程序

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

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

c++ user-interface gtk gtkmm
3个回答
1
投票

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

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


3
投票

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

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

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


0
投票

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

Gtk::Notebook很棒但是在菜单项点击的应用程序框架之间切换并不理想。自从gtkmm 3.10起,Gtk::Stack就可以缓解这个问题。假设你正在使用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; 
}
© www.soinside.com 2019 - 2024. All rights reserved.