首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在GTK3中拖放

如何在GTK3中拖放
EN

Stack Overflow用户
提问于 2021-06-21 03:50:40
回答 1查看 354关注 0票数 1

我想知道如何拖放GTK3。代码这里是为GTK2编写的,在GTK3中不工作。编译器抱怨seldata中没有onDragDataReceived元素。而且,如果在一次拖放中有多个文件,这将无法工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-21 03:50:40

如何在GTK3中执行拖放操作

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

代码语言:javascript
复制
static GtkTargetEntry targetentries[] =
{
    { "text/uri-list", 0, 0}
};

既然我们有了目标条目,就可以将特定的小部件设置为拖放目标。

代码语言:javascript
复制
gtk_drag_dest_set ( your_widget_here, GTK_DEST_DEFAULT_ALL, targetentries, 1, GDK_ACTION_COPY);

现在是信号处理程序:

代码语言:javascript
复制
g_signal_connect (your_widget_here, "drag-data-received", G_CALLBACK (on_drag_data_received), some_data_to_pass_along);

因此,当您将一个文件放到您的小部件上时,它将发出信号,因为您通过使它成为dnd目的地来准备它。

下面是回调函数:

代码语言:javascript
复制
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!
}

你就完蛋了!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68062089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档