2012-12-04 16 views
2

我的项目是创建一个图形应用程序来帮助每个员工在中央数据库中创建自己的客户列表,唯一的问题是兼容性在gtk3gtk2之间。该项目始于gtk3,然后我意识到有员工只使用gtk2系统。所以我对实现进行了一些修改而没有太大困难,并且在其目的上没有任何问题。我想完成的最后一件事是模拟gtk_widget_get_hexpand()gtk_widget_get_vexpand()的功能......他们只在gtk3。对于其他功能的工作方式相同gtk3我做了这样的事情:如何使用像`GtkAttachOptions`这样的`enum`类型设置小部件属性?我试图模拟`gtk_widget_set_vexpand`来处理`gtk2`

#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()

我知道这是不正确的!其实我不知道如何设置widgetschild properties以及更具体的如何创建GValueG_TYPE_ENUM。有人能帮我吗?

更新:@ptomato给了我一个更好的解决方案。实际使用gtk_container_child_set()功能,而不是gtk_container_child_set_property()则:

#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!

回答

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); 
+0

谢谢你的回答!我试图这样做,基本上'GTK_IS_CONTAINER(容器)失败'具有相同的错误'Gtk-CRITICAL'。从一开始就意味着什么是错误的。我忘了写这个 – memosdp

+0

在你做这件事之前,确保这些小部件被添加到容器中? – ptomato

+0

当然是在容器中加入之前。这很奇怪。也许是因为这个操作是异步的?其实我这样做:小部件创建 - >容器添加(在网格或表:附加) - >小部件设置 – memosdp

相关问题