C GtkFixed的用法:内部小部件忽略坐标

C GtkFixed的用法:内部小部件忽略坐标,c,gtk2,C,Gtk2,我正在尝试将GtkFrame,在GtkFixed中,向左移动。原始代码如下 frm_2 = gtk_frame_new (NULL); gtk_widget_show (frm_2); gtk_fixed_put (GTK_FIXED (fixed1), frm_2, 160, 16); gtk_widget_set_size_request (frm_2, 1105, 264); gtk_frame_set_shadow_type (GTK_FRAME (frm_2), GTK_SHADOW_

我正在尝试将GtkFrame,在GtkFixed中,向左移动。原始代码如下

frm_2 = gtk_frame_new (NULL);
gtk_widget_show (frm_2);
gtk_fixed_put (GTK_FIXED (fixed1), frm_2, 160, 16);
gtk_widget_set_size_request (frm_2, 1105, 264);
gtk_frame_set_shadow_type (GTK_FRAME (frm_2), GTK_SHADOW_ETCHED_OUT);

fixed3 = gtk_fixed_new ();
gtk_widget_show (fixed3);
gtk_container_add (GTK_CONTAINER (frm_2), fixed3 );

frm_1_frm_2 = gtk_frame_new (NULL);
gtk_widget_show (frm_1_frm_2);
gtk_fixed_put (GTK_FIXED (fixed3), frm_1_frm_2, 6, 8); // <-- THIS
gtk_widget_set_size_request (frm_1_frm_2, 250, 224);
gtk_frame_set_shadow_type (GTK_FRAME (frm_1_frm_2), GTK_SHADOW_ETCHED_OUT);

gtk_fixed_put (GTK_FIXED (fixed3), frm_1_frm_2, 50, 8);
在所有情况下,结果都是一样的:GtkFrame位置看起来没有改变,其行为方式与第一个代码段相同

小部件的完整层次结构是:

GtkWindow( GTK_WINDOW_TOPLEVEL )
|
+-GtkFixed fixed1
| |
| +-GtkFrame
|
+-GtkFrame frm_2
    |
    +-GtkFixed fixed3
      |
      +-GtkFrame frm_1_frm_2
      |
      +-GtkFrame another frame
...
Gtk版本为:

ls libgtk*
libgtk-x11-2.0.so.0.2400.23

  • 我做错了什么

  • 我如何解决它

  • 对不起,我的英语不好。

    \p>\1请提供一个你观察到的最起码的工作示例。幸运的是,从您发布的内容来看,我不需要做太多的工作就可以将其粘贴到现有的代码库中并进行构建,但问题可能不在您发布的代码范围内(即使只是间接地)。我已经试用了您的代码,内部小部件按照任务显示(不同的位置对应不同的x值)

    #2永远不要使用GtkFixed。我知道有很多教条式的编码准则(我个人喜欢goto),但这一条有其优点。Gtk位于显示管理器之上,而显示管理器将位于x11 quartz或wayland等后端之上。Gtk没有说明小部件应该放在哪里。那不是它的工作。它只能提供建议

    你很可能会遇到这样的情况,Gtk走进办公室,说“我想要这个和那个,在下班前把它放在我的桌子上”

    Gdk说“肯定是老板”

    当他走出房间时,x11会说:“难道他不知道这会破坏可访问性吗?”或者“一个甚至不在屏幕范围内的关闭按钮有什么用?”或者甚至“计算机说不”

    “把它放在你认为最好的地方,我会想办法把报告弄糊涂的。”

    “什么?”

    “完全正确”


    总之,您的显示管理器将做出许多您无法(主要是因为您不应该)控制的决策。这可能就是为什么你的小部件不在你想要的地方。尽量避免依赖GtkFixed,而是使用其他容器,并根据需要添加填充和间距,以获得类似效果。只是不要使用GtkFixed。这是邪恶的。在未来的几年里,用户界面开发人员将向您发送仇恨邮件。不要使用GtkFixed。说真的,别这么做。生命是一件美好的事情,值得欣赏和珍惜,因为它是美好的。不要使用GtkFixed。你会像我的狗被修好一样,把尾巴夹在两腿之间,待上几个月。不要使用GtkFixed。

    +1非常感谢给您带来的不便。这些代码是我工作中的一个坏礼物。最后我解决了。。。这个问题很复杂,不容易重现。我们使用散列将变量与标识符链接起来。在另一个文件中,帧被移动以响应外部事件。。。我为这个糟糕的问题感到抱歉。。。
    GtkWindow( GTK_WINDOW_TOPLEVEL )
    |
    +-GtkFixed fixed1
    | |
    | +-GtkFrame
    |
    +-GtkFrame frm_2
        |
        +-GtkFixed fixed3
          |
          +-GtkFrame frm_1_frm_2
          |
          +-GtkFrame another frame
    ...