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

时间:2019-03-26 08:45:10

标签: c gtk2

我正在尝试将GtkFixed内部的GtkFrame移到左侧。下面的原始代码

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, 0, 8);

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

  1. 我在做什么错了?

  2. 我该如何解决?

对不起,我的英语不好。

1 个答案:

答案 0 :(得分:1)

#1请提供您所观察到的最低工作示例。幸运的是,从您提出的内容来看,我无需进行太多工作即可将其粘贴到现有代码库中并进行构建,但是问题可能出在您发布的代码之外(即使仅间接)。我已经尝试了您的代码,并且内部小部件按照其任务显示(不同x值的位置不同)。

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

您很可能遇到Gtk走进办公室的情况,说:“我想要这个,另一个要在营业结束时将它放在我的桌子上。”

Gdk说“确定了事情的老板”。

当他离开房间时,x11说:“他不知道那会破坏可及性吗?”或“甚至没有放在屏幕范围内的关闭按钮有什么用?”甚至“计算机说不”。

“只要把它放在您认为最好的位置,我就会找到一种混淆报告的方法。”

“ obfa-什么?”

“恰好”

总而言之,您的显示经理会做出很多您无法控制的决定(很大程度上是因为您不应该控制)。这可能就是为什么小部件不在您想要的位置的原因。尝试避免依赖GtkFixed,而是使用其他容器,并在需要时添加填充和间距以达到类似的效果。只是不要使用GtkFixed。这是邪恶的。 UI开发人员将在未来几年内向您发送仇恨邮件。不要使用GtkFixed。严重不要这样做。生命是美好的事物,因其美好之处而值得欣赏和珍惜。不要使用GtkFixed。您将花费数月的时间将尾巴放在双腿之间,就像我的狗被固定时一样。不要使用GtkFixed。