如何使用`ent`类型设置小部件属性,如`GtkAttachOptions`?我正在尝试模拟`gtk_widget_set_vexpand`来处理`gtk2`

时间:2012-12-04 00:14:23

标签: c linux gtk3 gtk2

我的项目是创建一个图形应用程序,以帮助每个员工在中央数据库中创建自己的客户列表,我遇到的唯一问题是gtk3gtk2之间的兼容性。项目从始至终都基于gtk3,然后我意识到有些员工只使用gtk2系统。所以我对实现做了一些修改而没有太大的困难,并且在其目的上没有任何问题。我想要完成的最后一件事是模拟gtk_widget_get_hexpand()gtk_widget_get_vexpand()的功能......它们只在gtk3中。对于其他函数的工作方式与gtk3相同,我做了类似的事情:

#define gtk_grid_new() gtk_table_new(1,1,false)
#define GTK_GRID(x) GTK_TABLE(x)
#define GtkGrid GtkTable
#define gtk_grid_attach(x1,x2,x3,x4,x5,x6) gtk_table_attach(x1,x2,x3,x3+x5,x4,x4+x6,GTK_FILL,GTK_FILL,0,0)

要让应用程序在没有gtk_widget_get_hexpand()gtk_widget_get_hexpand()功能的情况下工作,只需使用:

#define gtk_widget_set_hexpand(x1,x2)
#define gtk_widget_set_vexpand(x1,x2)

因为使用宏来模拟这些函数要复杂得多,我试着这样做:

inline void gtk_widget_set_hexpand(GtkWidget* widget,gboolean expanded) {
    GValue value = G_VALUE_INIT;
    g_value_init(&value,G_TYPE_ENUM);
    if(expanded)
        g_value_set_enum(&value,GTK_EXPAND);
    else
        g_value_set_enum(&value,GTK_FILL);
    gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(widget)),widget,"x-options",&value);
}

inline void gtk_widget_set_vexpand(GtkWidget* widget,gboolean expanded) {
    GValue value = G_VALUE_INIT;
    g_value_init(&value,G_TYPE_ENUM);
    if(expanded)
        g_value_set_enum(&value,GTK_EXPAND);
    else
        g_value_set_enum(&value,GTK_FILL);
    gtk_container_child_set_property(GTK_CONTAINER(gtk_widget_get_parent(widget)),widget,"y-options",&value);
}

gtk_container_child_set_property()

我知道这不对!实际上我不知道如何设置child properties的{​​{1}}以及更具体的如何使用widgets创建GValue。有人能帮助我吗?

更新:@ptomato给了我一个更好的解决方案。实际上,使用gtk_container_child_set()函数而不是G_TYPE_ENUM然后:

gtk_container_child_set_property()

成功了!感谢@ptomato!

1 个答案:

答案 0 :(得分:1)

改为使用gtk_container_child_set()

gtk_container_child_set(GTK_CONTAINER(gtk_widget_get_parent(widget)), widget,
    "y-options", expanded? GTK_EXPAND : GTK_FILL,
    NULL);