我如何在 GTK3 中拖放
How do I do drag and drop in GTK3
我想知道如何在 GTK3 中拖放。代码 here 适用于 GTK2,不适用于 GTK3。编译器抱怨 onDragDataReceived
中的 seldata
中没有 data
元素。而且,如果您在一次拖放中有多个文件,这将不起作用。
如何在 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!
}
大功告成!
我想知道如何在 GTK3 中拖放。代码 here 适用于 GTK2,不适用于 GTK3。编译器抱怨 onDragDataReceived
中的 seldata
中没有 data
元素。而且,如果您在一次拖放中有多个文件,这将不起作用。
如何在 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!
}
大功告成!