Gtk3 - 回滚失败的拖放

时间:2016-08-22 20:57:23

标签: c drag-and-drop gtk3

我正在尝试实施拖放功能我的gtk-gui的丢弃行为。 使用下面的代码我可以拖动一个按钮...我不知道如何将拖动的按钮回滚到原来的位置,如果它被丢弃的地方。 (到目前为止,我没有指定gtk_drag_dest)。这是我的代码的相关片段:

GtkTargetEntry targetEntry;

void on_drag_end(GtkWidget *widget, GdkDragContext *context,GtkWidget *box)
{
    gtk_container_add(GTK_CONTAINER(box),widget);
}

void on_drag_begin(GtkWidget *widget, GdkDragContext *context,GtkWidget *box)
{
    gtk_container_remove(GTK_CONTAINER(box),widget);
    gtk_drag_set_icon_widget ( context, widget, 1, 1);
}

void myFunc(GtkWidget *mainTable, ...)
{
    GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL,0);
    gtk_container_add (GTK_CONTAINER (mainTable), box);

    GtkWidget *button = gtk_button_new_with_label ("X");
    g_signal_connect(button, "drag-begin",G_CALLBACK(on_drag_begin),box);
    g_signal_connect(button, "drag-end",G_CALLBACK(on_drag_end),box);
    gtk_drag_source_set(button,GDK_BUTTON1_MASK,&targetEntry,1,GDK_ACTION_MOVE);
    gtk_container_add (GTK_CONTAINER (box), button);
}

当我在gtk_container_add中调用拖动on_drag_end时释放鼠标按钮时出现以下错误:

  

Gtk-WARNING **:尝试将类型为GtkButton的小部件添加到   GtkBox类型的容器,但小部件已经在容器内   GtkWindow类型,请从现有的小部件中删除   容器第一。

那么如何从拖放窗口中删除按钮?我可以从上下文中以某种方式获得拖放窗口吗?

修改

如果我像这样修改on_drag_end

void on_drag_end(GtkWidget *widget, GdkDragContext *context,GtkWidget *box)
{
  GtkWidget *parent = gtk_widget_get_parent(widget);
  gtk_container_remove(GTK_CONTAINER(parent),widget);
  gtk_container_add(GTK_CONTAINER(box),widget);
}

gtk_container_remove上会弹出一个不同的错误:

  

(cron-gui:3319):Gtk-CRITICAL **:gtk_bin_remove:断言   'priv->孩子==孩子'失败

0 个答案:

没有答案