LINUX.ORG.RU

Как извлечь расширение из имени типа

 ,


0

3

Привет, ЛОР.

У кутешного класса QDocumentWriter есть метод supportedDocumentFormats(), который возвращает список поддерживаемых форматов документов. Список возвращается в виде человекочитаемых условных имён (markdown, plaintext…). При этом сам QDocumentWriter по умолчанию использует формат, извлечённый из имени файла, например, если задано имя foo.odt, используется формат ODF.

Есть ли какой-то способ по имени формата определить связанные с ним суффиксы имён файлов? Например, чтобы пользователь мог выбрать этот формат прямо в QFileDialog, как это в десктопных приложениях обычно делается.

У меня сейчас на уме 2 варианта.

  1. Зашить это соответствие (хоть через std::map) прямо в программу и делать QTextDocumentWriter::setFormat() из программы в зависимости от суффикса. Благо сейчас форматов всего 4: plaintext, HTML, ODF и markdown. И это будет именно тот UX, к которым привыкло большинство десктоп-пользователей. Но во-первых, меня не покидает ощущение, что я делаю что-то некрасивое, а во-вторых, в новых версиях Qt номенклатура форматов может поменяться.

  2. Выбирать формат отдельным комбобоксом ещё до выбора имени файла. Это некрасиво и избыточно для пользователя. Ну и есть подозрение, что суффикс всё равно придётся подставлять руками (хотя тут надо проверять, может, QTextDocumentWriter это умеет делать сам).

Интерес пользователя для меня в приоритете. Поэтому, скорее всего, в своём проекте пойду по варианту 1, наплевав на красоту архитектуры. Но может, есть другое решение? Чтобы и овцы были целы, и волки сыты, и пастуху вечная память?

★★★★★
Ответ на: комментарий от etwrq

Это, вероятно, было бы оно, если бы сам supportedDocumentFormats() возвращал MIME-типы. Вообще, идея-то хорошая, в самой Qt есть класс QMimeType.

Но он возвращает не x-web-markdown, а просто markdown.

hobbit ★★★★★
() автор топика
Ответ на: комментарий от hobbit

https://invent.kde.org/qt/qt/qtbase/-/blob/dev/src/gui/text/qtextdocumentwrit...
это буквально стоковый набор форматов который умеет этот класс.
есть ещё система плагинов для кутей, но надежды на это мало.
по поводу UX, с расширениями я бы шифтанулся в сторону как написано в mime, ну и плюс *.* - «Все файлы».
описание типов файлов тоже можно взять из mime, и уже как-нибудь адаптировать если места мало.
*сорри за кде-шный гит с кутями, оригинальная почему-то огорожена, по крайней мере с моего localhost'a

etwrq ★★★★★
()
Последнее исправление: etwrq (всего исправлений: 1)

А там пользовательский формат можно будет выбрать (CSV,OFX)? Я б не зашивал и дал бы возможность пользователю свой формат выставить по итогу. Но с другой стороны на первый порах лучше не заморачиваться и инкапсулировать вопрос для дальнейших изменений.

necromant ★★
()
Ответ на: комментарий от necromant

Я б не зашивал и дал бы возможность пользователю свой формат выставить по итогу.

А логику своего формата пользователь откуда возьмёт, если мы говорим именно про пользователя, а не про человека, могущего кутешный плагин написать? А если мы говорим именно про последнего, то возвращаемся к вопросу о наименовании форматов. Это даже не MIME-тип, это нечто в произвольной форме (хотя некоторые буковки совпадают).

Тьфу ты, там оно вообще захардкожено, как из кода по ссылке @etwrq следует. Я почему-то думал, что оно в плагины вынесено, как это с imageformats сделали. Тогда не «человека, могущего кутешный плагин написать», а «человека, готового патчить Qt».

hobbit ★★★★★
() автор топика
Последнее исправление: hobbit (всего исправлений: 1)
Ответ на: комментарий от ptah_alexs

Там есть text/markdown (не просто markdown), odf выступает расширением совсем не для того шифра, который у кутешников возвращается в supportedDocumentFormats(), есть text/plain, но нет plaintext.

Да, если бы supportedDocumentFormats() возвращал именно имена MIME-типов, эта тема либо не была бы создана, либо была бы решена первым же комментарием.

hobbit ★★★★★
() автор топика

Из исходника же видно, что и названия типов, и расширения там захардкодены и никаких таблиц для них не используется. И расширение он подставлять сам не умеет.

делать QTextDocumentWriter::setFormat() из программы в зависимости от суффикса

Зачем? Как раз определять формат по суффиксу он умеет и сам. Или можно в setFormat сам суффикс и передать безо всяких конвертаций - если он отличается от настоящего суффикса файла. Правда о том, поддерживается ли он, ты узнаешь только когда тебе функция записи ошибку вернёт, setFormat сам поддержку не проверяет.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 2)
Ответ на: комментарий от firkax

Как раз определять формат по суффиксу он умеет и сам.

Да, я в курсе. Не, если я захардкожу в файловом диалоге 4 суффикса плюс «Все поддерживаемые» и «Все файлы» – проблем в известных мне на настоящий момент версиях Qt точно не будет. Хотелось бы просто поизящнее решить вопрос, но судя по тому, что я наблюдаю в исходнике, на который выше кинули ссылку – поизящнее не получится by design.

hobbit ★★★★★
() автор топика

В общем, я захардкодил расширения для 4 типов, постаравшись этот хардкод сделать прозрачным и расширяемым.

Предложение вынести это в конфиг само по себе хорошее, но некоторые соображения сводят его полезность на нет. Почему – наверное, напишу в отдельной теме, это выходит сильно за рамки первоначального вопроса.

Тему решённой не отмечаю, ибо это не решение, а костыль. Но уж какой есть.

hobbit ★★★★★
() автор топика