c - 有复制 Gtk 小部件的好方法吗?

标签 c gtk copy-constructor gobject

有没有办法,使用 C 中的 Gtk 库,克隆一个 Gtk 按钮(例如),并将它打包到应用程序的其他地方。我知道您不能将同一个小部件打包两次。这段代码显然行不通,但显示了当我尝试对按钮进行浅拷贝时会发生什么:

GtkButton *a = g_object_new(GTK_TYPE_BUTTON, "label", "o_0", NULL);
GtkButton *b = g_memdup(a, sizeof *a);
gtk_box_pack_start_defaults(GTK_BOX(vbox), GTK_WIDGET(b));

周围的代码创建了一个 vbox 并将其打包在一个窗口中并运行 gtk_main()。这将导致这些难以理解的错误消息:

(main:6044): Gtk-CRITICAL **: gtk_widget_hide: assertion `GTK_IS_WIDGET (widget)' failed

(main:6044): Gtk-CRITICAL **: gtk_widget_realize: assertion `GTK_WIDGET_ANCHORED (widget) || GTK_IS_INVISIBLE (widget)' failed
**
Gtk:ERROR:/build/buildd/gtk+2.0-2.18.3/gtk/gtkwidget.c:8431:gtk_widget_real_map: assertion failed: (GTK_WIDGET_REALIZED (widget))

同理,如果我要编写自己的 GObject(不一定是 Gtk 小部件),是否有编写复制构造函数的好方法。我认为它应该是一个带有可选 Hook 的接口(interface),主要基于属性,以某种方式处理类的层次结构。

我想这样做:

GtkButton *b = copyable_copy(COPYABLE(a));

如果 GtkButton 可以使用理论上的可复制接口(interface)。

最佳答案

我不这么认为。据我所知,不能保证小部件将所有状态保存在属性中,您可以从外部访问这些状态。如果小部件通过不导出它来“隐藏”状态,则您无法从外部复制它。

从技术上讲,小部件可以只在它们的核心 struct 中包含您从实现外部看不到的字段,因此您甚至不能使用愚蠢的 memcpy( ),除非您愿意通过手动计数和使用文字来指定字节数。

话虽如此,也很有可能有足够多的小部件通过属性公开足够多的状态,以至于副本仍然可以运行,并且可能只会出现一些小故障。这肯定是一个非常酷的 hack。我建议直接询问核心 GTK+ 开发人员,也许在 gtk-devel-list 上邮件列表。

关于c - 有复制 Gtk 小部件的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3003655/

相关文章:

c - 调用 printf() 是如何在此处添加数字的?

combobox - Python GTK : how to check if a combobox is open?

c++ - 复制构造函数参数

c++ - 我可以显式调用复制构造函数吗?

c - Valgrind 报告可能的堆栈溢出 - 这是什么意思?

C - 数组函数求值

c - gtk+ 以编程方式在包含 vte 终端的scrolled_window 中向后滚动一行

gtk - 在 CentOS 6 上使用 ATK 2.2.0 编译 GTK+ 3 的 undefined symbol

c++ - 复制构造函数调用无限循环,尽管通过引用调用

c - 从已知内存地址 : Troubleshooting 检索数据