我的项目是创建一个图形应用程序来帮助每个员工在中央数据库中创建自己的客户列表,而我遇到的唯一问题是gtk3
和gtk2
. 该项目从头到尾都是基于gtk3
然后我意识到有些员工只使用一个系统gtk2
。因此,我毫不费力地对实现进行了一些修改,并且在其目的上没有任何问题。我要完成的最后一件事是模拟gtk_widget_get_hexpand()
and的功能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()
andgtk_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
和widgets
更具体的如何创建GValue
with G_TYPE_ENUM
。有人能帮我吗?
更新:@ptomato 给了我一个更好的解决方案。实际上通过使用gtk_container_child_set()
函数而不是gtk_container_child_set_property()
then:
#define gtk_widget_set_hexpand(x1,x2) gtk_container_child_set(GTK_CONTAINER(gtk_widget_get_parent(x1)),x1,"x-options",(x2)?(GTK_FILL|GTK_EXPAND):GTK_FILL,NULL);
#define gtk_widget_set_vexpand(x1,x2) gtk_container_child_set(GTK_CONTAINER(gtk_widget_get_parent(x1)),x1,"y-options",(x2)?(GTK_FILL|GTK_EXPAND):GTK_FILL,NULL);
成功的伎俩!感谢@ptomato!