1

我对 C++ 比较陌生,我对 Java 中的 MCV 编程有一些经验。我在 C++ 上使用 GTKmm 我正在尝试做的是编写一个应用程序,供助教提交和编辑各种职位的应用程序,以及管理员来查看并接受这些应用程序。

我在乞讨时要做的是创建3个“框架”(我目前正在为学生提交申请)

  • 这首先将有 2 个按钮 1 用于选择您是否是学生/管理员

  • 单击您是学生后,我想隐藏此框架并显示我的第二个框架

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

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

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

4

3 回答 3

3

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

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

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

于 2016-04-17T09:43:00.927 回答
1

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

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

于 2013-02-10T04:31:41.443 回答
0

A bit too late ! But here is my try :

Gtk::Notebook is great but it is not ideal in switching between app frames on menu item clicks. Gtk::Stack, since gtkmm 3.10, exists to mitigate this. Assuming you're using glade and Gtk::Builder :

class

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;
//...
}

constructor

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));
}

our callback

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; 
}
于 2019-05-01T07:05:32.553 回答