【问题标题】:GTK+ dynamic arrayGTK+ 动态数组
【发布时间】:2015-05-06 14:19:07
【问题描述】:

正如另一篇文章所建议的那样,我会提出新的问题,更具体的问题。

GtkWidget *button[] /*to be a dynamic array */

void file_folder(GtkWidget *widget,  gpointer data)
{
  GtkWidget* dialog;

  dialog = gtk_file_chooser_dialog_new("Choose a file", GTK_WINDOW(data),
          GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_OK, GTK_RESPONSE_OK,
          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);

  gtk_widget_show_all(dialog);
  gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), "/home/demo/Downloads");
  gint resp = gtk_dialog_run(GTK_DIALOG(dialog));


  if(resp == GTK_RESPONSE_OK)
  {
      /*select file to execute*/
      g_print("Success\n");
      gtk_widget_destroy(dialog);
  }
  else
  {
      gtk_widget_destroy(dialog);
  }

}

如何执行选中的文件

以及如何创建包含以下内容的动态数组:

应用名称、应用图标和可执行文件(假设我在 ubuntu 上开发)。

【问题讨论】:

  • 我想说下一步是打印选择的实际文件名,而不是普通的"Success",并确保在关闭对话框之前有一个有效的副本。
  • 成功是针对测试问题,而不是文件应该执行的打印。

标签: c gtk2


【解决方案1】:

首先使用gtk_file_chooser_get_filename()获取选中文件的文件名。

gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));

获取文件的文件名后,可以参考this answer,使用fork()execv()执行文件。

对于您的动态数组,您需要使用自定义结构的数组。例如:

struct my_button {
    const char *app_name;
    GtkWidget *app_icon;
    const char *exec_path;
}

然后可以创建struct my_button 的动态数组。你可以自己实现这个,我相信你可以在网上找到很多教程。或者,您可以使用 GLib(GTK+ 使用),它提供了许多您可以使用的动态数据结构,例如阵列。示例:

struct my_button *b = malloc(sizeof *b);
b->app_name = "whatever"; // etc
GArray *arr = g_array_new(TRUE, TRUE, sizeof *b);
g_array_append_vals(arr, b, 1);

使用后记得释放已用的内存。

有关 GArray 的更多详细信息,请参阅documentation

【讨论】:

  • 感谢您的快速回复!当我使用系统时,它获取路径和文件但返回“权限被拒绝”。
  • @user4702146 在终端中输入ls -l /path/to/file,检查第一列,它应该是-rwx的组合。看看有没有x。如果没有,请在终端中运行chmod +x /path/to/file,然后再次运行您的程序。
  • 我的意思是,当我从对话框中选择要运行的文件(jpg、png 图像 fop 示例)时,它会抛出 Permission denied。
  • @user4702146 那是因为图像文件不是可执行文件。
【解决方案2】:

我找到了解决方案!

execl("/usr/bin/xdg-open", "xdg-open", filename, (char *)0);

exit(1);

完成了任务。

【讨论】:

    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多