我的项目是创建一个图形应用程序,以帮助每个员工在中央数据库中创建自己的客户列表,我遇到的唯一问题是gtk3
和gtk2
之间的兼容性。项目从始至终都基于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!
答案 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);