首页 > 解决方案 > GtkFixed 的用法:内部小部件忽略坐标

问题描述

我正在尝试将 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. 我该如何解决?

对不起,我的英语不好。

标签: cgtk2

解决方案


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

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

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

Gdk 说“肯定的老板”。

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

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

“obfa——什么?”

“确切地”

总之,您的显示管理器会做出很多您无法(主要是因为您不应该)控制的决定。这可能就是您的小部件不在您想要的位置的原因。尽量避免依赖 GtkFixed,而是使用其他容器并在您认为有必要时添加填充和间距以获得类似的效果。只是不要使用 GtkFixed。这是邪恶的。UI 开发人员将在未来几年向您发送讨厌的邮件。不要使用 GtkFixed。认真别做。生活是一件美好的事情,值得欣赏和珍惜它的所有美好。不要使用 GtkFixed。你会在两腿之间夹着尾巴度过几个月,就像我的狗被固定时一样。不要使用 GtkFixed。


推荐阅读