C语言 如何在GtkFileToolserWidget(GTK4)的右窗格中捕获单击的文件夹名称?

6l7fqoea  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(94)

我的盒子运行Ubuntu 21.10。我使用GTK 4,C语言和GUI的XML描述。我是一般GUI的新手,特别是GTK 4。
该程序使用一个GtkFileToolserWidget,因为我需要一个Widget,除了嵌入到主窗口,显示在其右窗格中的文件和文件夹列表根据导航的用户。
这个程序的目标只是捕获用户刚刚在GtkFileToolserWidget右窗格的文件和文件夹列表中单击的文件夹的名称(仅文件夹名称,而不是文件名)。
代码(见下文)有两个问题:
1.所捕获的文件夹的名称不是刚刚执行的点击的名称,而是先前点击的名称;
1.该程序还捕获文件夹的名称后,点击'完整的路径'显示在上半部分的GtkFileToolserWidget,这一程序不应该授权。
下面是XML代码:

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <requires lib="gtk" version="4.0"/>
  <object class="GtkWindow" id="window1">
    <property name="child">
      <object class="GtkGrid" id="grid1">
        <child>
          <object class="GtkFrame" id="frame1">
            <child>
              <object class="GtkFileChooserWidget" id="folderChooserWidget1">
                <property name="action">select-folder</property>
                <property name="select-multiple">True</property>
              </object>
            </child>
          </object>
        </child>
      </object>
    </property>
  </object>
</interface>

字符串
下面是C代码:

#include <gtk/gtk.h>
#include <glib/gprintf.h>

static void on_click (GtkGestureClick *controller, int n, double x, double y, GtkFileChooser *folderChooser)
{
  GFile *file = NULL;
  char *basename = (char *)NULL;

  file  = gtk_file_chooser_get_file (folderChooser);
  if (file == NULL)
    g_printf ("No folder selected!\n");
  else
  {
    basename = g_file_get_basename (file);
    g_printf ("folder selected: %s\n", basename);
    g_free (basename);
  }
}    

static void app_activate (GApplication *application)
{
  GtkApplication *app;
  GtkBuilder *builder1;
  GObject *window1;
  GObject *folderChooserWidget1;

  app = GTK_APPLICATION (application);

  builder1 = gtk_builder_new ();
  gtk_builder_add_from_file (builder1, "xml.ui", NULL);

  window1 = gtk_builder_get_object (builder1, "window1");
  gtk_window_set_application (GTK_WINDOW (window1), app);

  folderChooserWidget1 = gtk_builder_get_object (builder1, "folderChooserWidget1");
  GtkGesture *controller;
  controller = gtk_gesture_click_new ();
  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (controller), 0);
  gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (controller), TRUE);
  gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (controller), GTK_PHASE_CAPTURE);
  g_signal_connect_after (controller, "pressed", G_CALLBACK (on_click), GTK_FILE_CHOOSER (folderChooserWidget1));
  gtk_widget_add_controller (GTK_WIDGET (folderChooserWidget1), GTK_EVENT_CONTROLLER (controller));

  gtk_widget_show (GTK_WIDGET (window1));

  g_object_unref (builder1);
}    

int main (int argc, char *argv[])
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("xx.yy.zz", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (app_activate), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);

  g_object_unref (app);

  return (status);
}

tktrz96b

tktrz96b1#

关于第一个问题,我在我的Ubuntu 20.04机器上使用你的代码和“ui”定义构建了一个项目。当我运行这个程序时,我可以调出文件选择器,我经历了你注意到的选择滞后。这让我专注于你的信号连接语句。

g_signal_connect_after (controller, "pressed", G_CALLBACK (on_click), GTK_FILE_CHOOSER (folderChooserWidget1));

字符串
这使我考虑到对信号处理程序的调用可能不应该出现在单击鼠标按钮的过程中,而应该出现在释放鼠标按钮的过程中。因此,我对您的信号连接语句进行了一个小的修改。

g_signal_connect_after (controller, "released", G_CALLBACK (on_click), GTK_FILE_CHOOSER (folderChooserWidget1));


在我做了那个改变并重建了程序之后,文件选择器的行为似乎和你所追求的一样。请尝试这个小的修改,看看是否能解决问题#1。
祝你好运

rslzwgfq

rslzwgfq2#

我尝试了这个例子,但得到了不同的结论。下面的修改对我很有效:

g_signal_connect_after (controller, "stopped", G_CALLBACK (on_click), GTK_FILE_CHOOSER (folderChooserWidget1));

字符串
祝你好运

相关问题