c - GtkFixed : inner widget ignores the coordinates 的用法

标签 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 请提供您所观察到的最低工作示例。幸运的是,从你提出的内容来看,我不需要做太多工作就可以将它粘贴到现有的代码库中并进行构建,但问题可能出在你发布的代码之外(即使只能间接)。我已经尝试了您的代码,并且内部小部件显示了它的任务(不同的 x 值的不同位置)。

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

您很可能遇到这样的情况,Gtk 走进办公室,说“我想要这个那个,下类前把它放在我的 table 上”。

Gdk 说“确定老板”。

当他离开房间时,x11 说“他不知道这会破坏无障碍访问吗?”或“甚至不在屏幕范围内的关闭按钮有什么用?”甚至“电脑说不”。

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

“obfa-什么?”

“完全正确”

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

关于c - GtkFixed : inner widget ignores the coordinates 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55352945/

相关文章:

c - 打印并扫描字符串 c

c - 结构中成员的错位

c - 将整数值转换为 void* 是回调中常用的范例吗?

c++ - BadAlloc X 错误

Eclipse - 如何更改包资源管理器的字体颜色?

java - 强制java程序使用GTK2

c - 在 C 语言中使用 rand( ) 生成随机整数序列

c++ - ffmpeg assert - 抛出异常而不是中止

gtk - 加载我的 xfce 插件时出现严重错误 : Not enough arguments are passed to the wrapper,

python - 接受争论