Có cách nào, bằng cách sử dụng thư viện Gtk trong C, để sao chép một nút Gtk (ví dụ), và gói nó ở một nơi khác trong ứng dụng. Tôi biết bạn không thể đóng gói cùng một widget hai lần. Và rằng mã này rõ ràng sẽ không làm việc, nhưng cho thấy những gì xảy ra khi tôi cố gắng một bản sao cạn của nút:Có cách nào tốt để sao chép tiện ích Gtk không?
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));
Có là mã mà tạo ra một vbox và gói nó trong một cửa sổ và chạy gtk_main xung quanh() . Điều này sẽ dẫn đến những khó khăn để hiểu các thông báo lỗi:
(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))
Dọc theo đường cùng, nếu tôi được viết GObject của riêng tôi (không nhất thiết là một widget Gtk), là có một cách tốt để viết một constructor sao chép. Im nghĩ rằng nó phải là một giao diện với các móc tùy chọn và dựa chủ yếu vào các thuộc tính, xử lý hệ thống phân cấp của lớp theo một cách nào đó.
Tôi muốn làm điều này:
GtkButton *b = copyable_copy(COPYABLE(a));
Nếu GtkButton có thể sử dụng một giao diện copyable lý thuyết.
Bạn có thể tạo giao diện GObject thực hiện điều 'có thể sao chép' bằng cách cung cấp móc và công cụ ... Tôi sẽ không muốn viết nó, mặc dù có lẽ gió sẽ trở nên khó khăn ... – Spudd86