28

在 Linux 桌面上使用 C++,获取图标、文档描述和与任意文件/文件路径“关联”的应用程序的最佳方式是什么?

我想使用最“规范”的方式在 KDE 和 gnome 上查找图标、mime 类型/文件类型描述和相关应用程序,并且我想避免对命令行和“低-level”例程以及避免自己重新发明轮子(不解析 mime-types 文件等)。

编辑和注释:

嘿,我最初问了这个关于 QT 文件信息对象的问题,并且“没有明确的答案”的答案似乎是正确的。但这是一个搞砸的情况,我打开这个问题寻找更多信息。

我不再特别关心 QT,我只是在寻找规范的方法来通过 KDE 和 gnome 上的 C++/c 函数调用来找到 mime 类型(尤其是 Gnome,因为这是最让我困惑的地方) . 我希望能够在 Gnome 和 Konquerer/KDE 上显示与 Nautilus 匹配的图标和描述,以及适当地打开文件等。

我想我可以为 KDE 和 Gnome 单独获取它。最大的问题是为 Linux 桌面获取所有这些信息的最常见/最佳/规范的方式是什么?Gnome 文档尤其不透明。gnome-vsf 有 mime 例程,但它已被弃用,我找不到 GIO/GFS 的 mime 例程,gnome-vsf 的替代品。有一个模糊的暗示,一个人应该使用开放的桌面应用程序,但使用哪一个是模糊的。libmagic 和 xdg 适合哪里?

指向一篇总结问题的文章,很高兴被接受。同样,我知道三行答案是“没有这样的动物”,但我正在寻找答案。

4

9 回答 9

15

这是一个使用 GLib/GIO 获取所需信息的示例。

#include <gio/gio.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
    g_thread_init (NULL);
    g_type_init ();

    if (argc < 2)
        return -1;

    GError *error;
    GFile *file = g_file_new_for_path (argv[1]);
    GFileInfo *file_info = g_file_query_info (file,
                                              "standard::*",
                                              0,
                                              NULL,
                                              &error);

    const char *content_type = g_file_info_get_content_type (file_info);
    char *desc = g_content_type_get_description (content_type);
    GAppInfo *app_info = g_app_info_get_default_for_type (
                                  content_type,
                                  FALSE);

    /* you'd have to use g_loadable_icon_load to get the actual icon */
    GIcon *icon = g_file_info_get_icon (file_info);

    printf ("File: %s\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    return 0;
}
于 2010-01-31T07:14:56.053 回答
3

为此,您可以使用xdg提供的工具,尤其是xdg-mime query.

要找出例如文件的文件类型,index.html您将

$ xdg-mime query filetype index.html

这将返回 mimetype。要查询与该 mimetye 关联的应用程序,请使用例如

$ xdg-mime query default text/html

这里返回epiphany.desktopie $APPNAME.desktop,因此很容易从中获取应用程序名称。如果您只想在默认应用程序中打开文件,您当然可以运行

$ xdg-open index.html

这会激发顿悟。

图标资源的查询功能似乎在 中不可用,但您可以使用pyxdgxdg-utils编写一个小的 Python 脚本,它也提供大量附加功能。

对于 C 绑定,您可能需要查看xdg页面上链接的portland代码。

编辑:

关于libmagic朋友们,您需要决定您的偏好:虽然 libmagic 在文件类型覆盖方面似乎更完整(和准确),但它根本不关心默认应用程序或图标。它也没有为您提供安装额外 mimetype 的工具。

于 2010-01-31T05:17:36.850 回答
3

在 Qt >= 4.6 中,有一个针对 X11 系统的新功能

QIcon QIcon::fromTheme ( const QString & name, const QIcon & fallback = QIcon() ) [static]

您可以使用此功能。此处的文档/ (Qt 5)

于 2010-12-26T22:52:51.457 回答
1

QFileIconProvider 和 QFileInfo 都不会对 OS mime 数据库做任何事情。要访问与不同 mime 类型关联的图标,您必须使用底层桌面环境的功能。在 Qt 中(还)没有规范的方法。

考虑一下您可以在 Gnome、KDE ​​和 Windows 中使用不同的图标。因此,例如,在 KDE 中,您将使用KMimeType

于 2009-10-27T08:44:16.100 回答
1

我刚刚找到KFileItem。此类为您提供 KDE 中有关图标、mime 类型和相关内容的一切。我确信在 gnome 中有一个等价物,但这提供了与 QT 应用程序相同级别的访问权限。

于 2009-12-04T02:43:15.113 回答
0

You may want to use the system's "/etc/mime.types" file. It is also a good idea to maintain your program's copy of a MIME type file. That way, you are not dependent on the system, but at the same time you need to keep it fairly exhaustive. Not sure about Icons.

于 2009-10-27T17:46:10.590 回答
0

也许看看这段代码: http: //ftp.devil-linux.org/pub/devel/sources/1.2/file-4.23.tar.gz

这是大多数 Linux/Unix 发行版上的标准文件 util。您将获得 MIME 类型和更多信息。

我认为 Gnome 和 KDE 都有自己的方法来确定这一点,并为其设置图标和标准应用程序。

无论如何,该文件工具可能是获取 mime 类型和文档描述的最佳方式。在某些情况下,甚至是有关内容的一些细节。

这将为您提供哑剧类型。无论如何,这就是您需要知道如何打开文件的内容。这些是分开的步骤。文件没有告诉你关于图标或打开文件的应用程序。

于 2010-01-27T05:01:49.283 回答
0

大约晚了 8 年,但仍然有用。

要在 KDE 中获取相关应用程序,您可以按照 Joe 的建议进行操作(使用KFileItem)。但是,这需要包含很多库。下面的代码需要的更少。

#include <QCoreApplication>
#include <QMimeDatabase>
#include <QDebug>

#include <KMimeTypeTrader>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);

  if (argc < 2)
  {
    qDebug() << "missing argument <filename>";
    return 1;
  }
  QMimeDatabase mimeDb;
  QMimeType     mimeType = mimeDb.mimeTypeForFile(QString::fromLocal8Bit(argv[1]));

  KService::List services = KMimeTypeTrader::self()->query(
      mimeType.name(),QStringLiteral("Application"));

  foreach(const QExplicitlySharedDataPointer<KService>& svc, services)
  {
    qDebug() << "service: " << svc->name();
    qDebug() << "exec: " << svc->exec();
  }
}

要编译代码,请添加QT += KService KCoreAddons到您的 qmake.pro文件中。

KMimeTypeTrader 和 KService 文档的链接:

于 2019-03-01T15:08:15.263 回答
0

复制/粘贴上面的好例子(使用 GLib/Gio)只是根据文档添加了正确释放分配的内存。我试图只编辑现有的答案,但它一直说编辑队列已满:(

#include <gio/gio.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
    g_thread_init (NULL);
    g_type_init ();

    if (argc < 2)
        return -1;

    g_autoptr(GError) error;
    GFile* file = g_file_new_for_path (argv[1]);
    GFileInfo* file_info = g_file_query_info (file,
                                              "standard::*",
                                              G_FILE_QUERY_INFO_NONE,
                                              NULL,
                                              &error);

    const char* content_type = g_file_info_get_content_type (file_info);
    g_autofree gchar* desc = g_content_type_get_description (content_type);
    GAppInfo* app_info = g_app_info_get_default_for_type (
                                  content_type,
                                  FALSE);

    /* you'd have to use g_loadable_icon_load to get the actual icon */
    GIcon* icon = g_file_info_get_icon (file_info);

    printf ("File: %s\nDescription: %s\nDefault Application: %s\n",
            argv[1],
            desc,
            g_app_info_get_executable (app_info));

    g_object_unref(file_info);
    g_object_unref(file);
    return 0;
}
于 2021-05-02T15:17:47.360 回答