我是GTK的新手,并不太明白如何使用g_signal_connect()。我正在构建一个基本的文件浏览器到目前为止它有两个面板,一个带有目录视图,另一个带有文件视图
#include <pwd.h>
#include <sys/types.h>
#include <string.h>
#include <gtk/gtk.h>
#include <errno.h>
#include <dirent.h>
#include <limits.h>
#include "ListView/buildList.h"
#include "TreeView/buildTree.h"
#define MAX_PATH 1024
int main(int argc, char **argv) {
gtk_init (&argc, &argv);
GtkTreeStore *store_tree = gtk_tree_store_new (COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
GtkTreeStore *store_list = gtk_tree_store_new (COLUMNS, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
char *working_dir = getenv("HOMEs");
if (working_dir != NULL) {
printf("Home dir in enviroment ");
printf("%s\n", working_dir);
}
else {
working_dir = pwd();
if(working_dir != NULL){
printf("Failed to find Home using current directory \n");
}
else{
printf("Directory error terminate");
exit(0);
}
}
GtkTreeIter iter_p;
if(list_dir(store_tree, working_dir, iter_p, 0) != 0){
printf ("Error building tree");
return 1;
}
if(build_list(store_list, working_dir) != 0){
printf ("Error building tree");
return 1;
}
//build first two views, tree and list.
GtkWidget *treeview = gtk_tree_view_new ();
GtkWidget *listview = gtk_tree_view_new ();
build_treeview(treeview);
build_listview(listview);
GtkTreeSelection *selection;
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(treeview));
g_signal_connect (G_OBJECT(selection), "changed",
G_CALLBACK(item_selected), NULL);
gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (store_tree));
gtk_tree_view_set_model (GTK_TREE_VIEW (listview), GTK_TREE_MODEL (store_list));
g_object_unref (store_tree);
g_object_unref (store_list);
display (treeview, listview);
gtk_main ();
return 0;
}
我希望能够检测用户何时选择目录并更改文件面板以显示新文件。现在当它检测到更改时,它只是输出到控制台,由selection
给出的一些信息查看文档看起来像G_CALLBACK只能给两个参数指向数据和选择。
我想知道是否有某种方法可以使用GTK等待更改目录并更新文件面板
/ * notes
treeview:是一列是gtk_tree结构
list_dir:recursivly从store_tree
中的某个路径创建目录子树listview:一列是名称,其中包含文件的名称
build_list:选择后的树视图可以返回该目录的路径。将所有文件存储在gtk_store store_list
目录中答案 0 :(得分:0)
在显示应用程序窗口之前,您的gtk_tree_view_get_selection
会被执行。因此它总是(!)为空,因为永远不会改变空选择,所以你永远不会收到"changed"
信号。
信号连接本身是正确的。