C Gtk中的拖放问题

C Gtk中的拖放问题,c,drag-and-drop,char,gtk,C,Drag And Drop,Char,Gtk,我正在用C语言中的GTK构建一个使用拖放的应用程序,但这部分代码有一个问题 void view_onDragDataReceived(GtkWidget *wgt, GdkDragContext *context, int x, int y,GtkSelectionData *seldata, guint info, guint time,gpointer userdata) { GtkTreeModel *model; GtkTreeIter iter; model

我正在用C语言中的GTK构建一个使用拖放的应用程序,但这部分代码有一个问题

void view_onDragDataReceived(GtkWidget *wgt, GdkDragContext *context, int x, int y,GtkSelectionData *seldata, guint info, guint time,gpointer userdata)
{
   GtkTreeModel *model;
   GtkTreeIter   iter;

    model = GTK_TREE_MODEL(userdata);

   gtk_list_store_append(GTK_LIST_STORE(model), &iter);

   gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_URI,(gchar*)seldata->data, -1);
    pathh=(char*)seldata->data;
      }   
我从这行代码中调用这个函数

 g_signal_connect(view, "drag_data_received",G_CALLBACK(view_onDragDataReceived), liststore);
我遇到的问题是,当我尝试在其他函数中使用该pathh变量时,我发现它是空的,即使它声明为全局变量类型char*

请尝试以下方法

struct SelectionData
{
    GtkListStore *listStore;
    gchar *path;
}
然后在调用者函数中

struct SelectionData *data;

data = malloc(sizeof(*data));
if (data == NULL)
    handleMallocFailureAndPleaseDoNotContinue();
data->listStore = liststore;
data->path      = NULL;

g_signal_connect(view, "drag_data_received",G_CALLBACK(view_onDragDataReceived), data);
然后

void view_onDragDataReceived(GtkWidget *wgt, GdkDragContext *context, int x, int y,GtkSelectionData *seldata, guint info, guint time, gpointer userdata)
{
    GtkTreeModel  *model;
    GtkTreeIter    iter;
    SelectionData *selectionData;
    size_t         length;

    selectionData = (SelectionData *)userdata;
    model = GTK_TREE_MODEL(selectionData->liststore);

    gtk_list_store_append(GTK_LIST_STORE(model), &iter);
    gtk_list_store_set(GTK_LIST_STORE(model), &iter, COL_URI,(gchar*)seldata->data, -1);
    length = strlen((char*)seldata->data);
    if (selectionData->path != NULL) /* for subsequent calls */
        free(selectionData->path);
    selectionData->path = malloc(1 + length);
    if (selectionData->path != NULL)
        memcpy(selectionData->path, seldata->data, 1 + length);
}
然后,您可以在其他地方访问
selectionData
,因此它是
path
字段,在您完成使用后,该字段必须是
free
d

尽量避免使用全局变量


您也可以使用相同的技术将
seldata->data
复制到
pathh
全局变量中,但请重新考虑您的设计,尽量不要使用
pathh
全局变量,因为您将使用
malloc
为字符串分配空间,而全局变量将是指向它的指针,因此,很难理解您必须在哪里以及如何
释放它。

pathh
一个全局变量吗?如果是,您应该重新设计您的程序,也可能是
GtkSelectionData*seldata
在传递给您的函数后被销毁,你可以打印
seldata->data
?是的,我可以打印seldata,当我进行转换时,我甚至可以打印pathh,但是当我在另一个函数中使用它时,它会丢失并且变为空,是的,pathh是一个全局变量。你如何初始化
liststore
?这就是我初始化它的方式'liststore=gtk\u list\u store\u new(数字列,G类型字符串)我现在遇到了一个分段错误:D是一种方式,我可以将创建模型的整个函数发送给您,这样您就可以告诉我要做哪些更改:D@RidaAmine我现在很忙,但你可以稍后在我的电子邮件中这样做iharob@gmail.com这个项目是干什么的?我看你已经做了一段时间了,我想这是最好的同一个项目,对吗?是的,这是同一个项目,只是因为考试我不得不停止,现在我正在恢复。这是一个管理教授添加的文件的应用程序,这样学生可以在没有网络内容后查看这些文件,但我计划稍后添加它们,我正在尝试集成拖放,以便您可以轻松添加文件:D@RidaAmine很酷,我收到了你的邮件,稍后会检查。大学/教授为此付钱给你了吗?哇,这真是一个家庭作业,我希望你做得很开心,顺便说一句,我父亲是阿拉伯人,他是叙利亚人。