crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Открыть с помощью...
RazrFalcon
  опции профиля:
сообщение 23.11.2011, 19:56
Сообщение #1


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Есть изображение в программе. Нужно в его контекстное меню добавить: "Открыть с помощью..." и список должен браться из системы. Это вообще реализуемо стандартными средствами?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
fadday
  опции профиля:
сообщение 24.11.2011, 10:35
Сообщение #2


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 23.11.2011
Пользователь №: 3024

Спасибо сказали: 0 раз(а)




Репутация:   0  


Скорей всего придется писать самому. А программы привязанные к конкретному типу файлов можно списком вытащить из реестра. В ветке HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/"формат файла"/OpenWithList - лежит список программ через которые можно открыть. На основе него, на сколько я понимаю, и строится меню "открыть с помощью...".
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 24.11.2011, 11:20
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 23.11.2011, 20:56) *
Есть изображение в программе. Нужно в его контекстное меню добавить: "Открыть с помощью..." и список должен браться из системы. Это вообще реализуемо стандартными средствами?

Система какая? Если линух, могу подсказать с desktop-файлами и mime-ом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.11.2011, 16:21
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Я думал про кьютешный метод...

Системные и так знаю...

Sokoloff, а что за способ? xdg?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 24.11.2011, 17:59
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 24.11.2011, 17:21) *
Я думал про кьютешный метод...

Системные и так знаю...

Sokoloff, а что за способ? xdg?

Qt-шного метода нет. Есть QDesktopServices::openUrl но, из-за ошибок в xdg-open и xdg-mime скриптах он работает правильно только в Gnome и KDE. Я разбирался как определить приоритет приложений для mime типа, если надо то могу описать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 24.11.2011, 19:17
Сообщение #6


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Ну я кроме gnome и kde ничего больше не юзал. Так что думал что QDesktopServices справляется везде.

В принципе мне не особо критично. Но на будущее интересно. Слушаю твой вариант ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Sokoloff
  опции профиля:
сообщение 25.11.2011, 13:56
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 237
Регистрация: 1.4.2009
Из: Москва
Пользователь №: 654

Спасибо сказали: 50 раз(а)




Репутация:   11  


Цитата(RazrFalcon @ 24.11.2011, 20:17) *
Ну я кроме gnome и kde ничего больше не юзал. Так что думал что QDesktopServices справляется везде.

В принципе мне не особо критично. Но на будущее интересно. Слушаю твой вариант ;)

Я тоже раньше так думал. Но FreeDesktop не опускается до таких "мелочей" а QDesktopServices использует xdg утилиты. Gnome и KDE работают по разному, поэтому вместо спецификации XDG написали костыли в xdg-open и xdg-mime. Алгоритм у них такой:

1. Получаем mime-type для файла.

2. Определяем среду
если установлена переменная окружения $KDE_FULL_SESSION, значит KDE
если GNOME_DESKTOP_SESSION_ID, то Gnome
еще определяются LXDE и XFCE, но ЕМНИП они работают аналогично гному.

3. Если Gnome, то используется его утилита и реестр. На эту ветку я забил.

4. Если KDE, то запускается утилита kfmclient. А ее логику можно эмулировать. Она использует поля MimeType и InitialPreference из desktop-файлов.
Рекурсивно бежим по всем файлам в /usr/share/applications и ищем файлы у которых в MimeType есть искомый тип.
Чем InitialPreference InitialPreference больше, тем приложение выше в списке. Самое верхнее - приложение по умолчанию.

Дефолтное приложение может быть перекрыто в ~/.local/share/applications/defaults.list.

Можешь выдрать куски из https://github.com/Razor-qt/razor-qt/blob/m...desktopfile.cpp метод XdgDesktopFileCache::getDefaultApp. Или используй мою библиотеку, она специально не зависит от razor, и может использоваться отдельно от него. Лицензия LGPL так что можно и в коммерческой программе использовать.

P.S. Пути могут отличатся в соответствии с XDG Base Directory Specification http://standards.freedesktop.org/basedir-s...pec-latest.html.


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.11.2024, 0:39