如何在GTK3中进行拖放

问题描述 投票:0回答:2

我想知道如何在 GTK3 中拖放。 here 的代码适用于 GTK2,在 GTK3 中不起作用。编译器抱怨

data
中的
seldata
中没有
onDragDataReceived
元素。而且,如果您一次拖放中有多个文件,这将不起作用。

drag-and-drop treeview gtk3
2个回答
3
投票

如何在 GTK3 中进行拖放

此处实现的拖放仅用于将文件复制到应用程序中。 所以,首先要做的是制作你的目标条目,也就是可以拖入什么样的东西。对于文本编辑器,你可以允许拖入文本。但在这个例子中,我们只想拖入文件.

static GtkTargetEntry targetentries[] =
{
    { "text/uri-list", 0, 0}
};

现在我们有了目标条目,我们可以将特定的小部件变成拖放目的地。

gtk_drag_dest_set ( your_widget_here, GTK_DEST_DEFAULT_ALL, targetentries, 1, GDK_ACTION_COPY);

现在是信号处理程序:

g_signal_connect (your_widget_here, "drag-data-received", G_CALLBACK (on_drag_data_received), some_data_to_pass_along);

因此,当您将文件放在小部件上时,它会发出信号,因为您通过将其设为 dnd 目的地来准备它。

回调函数如下:

void on_drag_data_received (GtkWidget *wgt, GdkDragContext *context, gint x, gint y, GtkSelectionData *seldata, guint info, guint time, gpointer data)
{
    gchar **filenames = NULL;
    filenames = g_uri_list_extract_uris((const gchar *) gtk_selection_data_get_data (seldata));
    if (filenames == NULL) // If unable to retrieve filenames:
    {
        g_printerr(“FAILURE!”);
        gtk_drag_finish(context, FALSE, FALSE, time); // Drag and drop was a failure.
        return;
    }
    int iter = 0;
    while(filenames[iter] != NULL) // The last URI list element is NULL.
    {
        char *filename = g_filename_from_uri (filenames[iter], NULL, NULL); 
        // Do something useful with the file, like opening it, right here.
        iter++;
    }
    gtk_drag_finish(context, TRUE, FALSE, time); // Drag and drop was successful!
}

你就完成了!


0
投票

之前的答案都没有任何区别。仍然会发射两次。 对我有用的是改变:

gtk_drag_dest_set ( your_widget_here, GTK_DEST_DEFAULT_ALL, targetentries, 1, GDK_ACTION_COPY);

至:

gtk_drag_dest_set ( your_widget_here, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT, targetentries, 1, GDK_ACTION_COPY);

这会删除 _DROP 部分。 _ALL 包括所有三个,显然 _DROP 触发的一系列操作重复将信号发送到“drag-data-received”回调函数。

© www.soinside.com 2019 - 2024. All rights reserved.