Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Экспорт шрифтов

Автор: ufna 6.4.2010, 22:51

Добрый день,

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

Автор: kwisp 7.4.2010, 8:42

ufna,
как вариант искать файлы шрифтов, сохранять, потом использовать

Цитата
See also QFontDatabase::addApplicationFont(), QFontDatabase::addApplicationFontFromData(), QFontDatabase::removeAllApplicationFonts(), and QFontDatabase::removeApplicationFont().


Автор: ufna 7.4.2010, 11:43

главный вопрос - как узнать который файл шрифта нам нужен?

платформа Win.

Автор: kwisp 7.4.2010, 12:06

ufna,

Цитата(ufna @ 7.4.2010, 12:43) *
главный вопрос - как узнать который файл шрифта нам нужен?

ну по-моему они там по смейству называются в винде-то, точно не вспомню, сейчас не под ней работаю.
где лежат фалы шрифтов тоже можно вычислить.
если честно не пойму в чем проблема.
выбирает пользователь шрифт, файл(ы) этого шрифта копируются в дирректорию программы, которая веместе с программой качует на другую машину, где все шорифты из этой дирректории подгружаются в приложение через QFontDatabase::addApplicationFont()
если файл точным совпадением имени семейства и имени фала не обнаружен, можно скопировать все похожие, по маске, либо если совсем грубо все шрифты, можно архивировать и проч и проч.

Автор: ufna 7.4.2010, 12:13

не, нет там такого. Название шрифта и название файла - совершенно разные вещи.

плюс - я не могу тянуть все. У меня без доп. шрифтов стоит их под 2Гб. Даже если возьму по маске самые необходимые - выходит немеряно :(

Программа юзеро-ориентированная, нужно выдрать только необходимое. Т.е. не буду же я говорить юзеру "вот у тебя проект на 200Мб, ты мне его файлик пришли, а с ним еще гигабайт шрифтов".

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

Автор: Litkevich Yuriy 7.4.2010, 12:29

Цитата(kwisp @ 7.4.2010, 16:06) *
если честно не пойму в чем проблема.
именно в определении файла.
1) Шрифт - MS Shell Dlg2, какому файлу соответствует?
2) Шрифт - Arial Narrow, какому файлу соответствует?

Файлов с такими именами не существует в каталоге WINNT/Fonts (на двухтоннике)
имена файлов на теже буквы:
1)MAIAN.TTF
marlett.ttf
MICR.TTF
MICRB.TTF
MICRBI.TTF
MICRI.TTF
micross.ttf
mingliu.ttc
modern.fon
MTCORSVA.TTF
MTEXTRA.TTF
mtfont.ttf
mtgerman.ttf

2) arial.ttf
Arialb.ttf
arialbd.ttf
arialbi.ttf
ariali.ttf

ufna, я думаю, что есть только один вариант - копать исходники QFontDatabase или вовсе API сисистемы

Автор: kwisp 7.4.2010, 12:38

Цитата(ufna @ 7.4.2010, 13:14) *
Программа юзеро-ориентированная, нужно выдрать только необходимое. Т.е. не буду же я говорить юзеру "вот у тебя проект на 200Мб, ты мне его файлик пришли, а с ним еще гигабайт шрифтов".

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

еще стоит посмотреть виндовый апи если такой возможности нет то врядли и в Qt будет.

Автор: Litkevich Yuriy 7.4.2010, 13:50

Панель управления -> шрифты:


Первый столбец название, второй - файл. Т.е. можно попытаться построить словарь шрифт-файл, наверное с помощью WinAPI.

кое чего нашёл, http://www.codeproject.com/KB/GDI/fontfile.aspx

Исходник оттуда  FontFile_src.zip ( 4.73 килобайт ) : 200


вообщем список файлов под виндовозом надо смотреть здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts
выделенное - нужно для WinNT, для предыдущих версий виндовоза оно не нужно

Автор: ufna 7.4.2010, 14:00

О, спасибо, сейчас буду разбирать! :)

Автор: Litkevich Yuriy 7.4.2010, 14:18

Цитата(ufna @ 7.4.2010, 18:00) *
О, спасибо, сейчас буду разбирать!
Я уже всё разобрал:
    QSettings settings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts",
                    QSettings::NativeFormat);

    foreach(QString s, settings.allKeys()){
        qDebug() << "Font name:" << s << "\t\tFont file:" << settings.value(s).toString();
    }
:)

Автор: SABROG 7.4.2010, 15:31

Цитата(Litkevich Yuriy @ 7.4.2010, 15:18) *
QSettings settings("HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts",

Тут вероятно пригодится WinVersion QSysInfo::windowsVersion () [static], чтобы правильный путь выбрать.

Автор: Litkevich Yuriy 7.4.2010, 15:44

Цитата(SABROG @ 7.4.2010, 19:31) *
Тут вероятно пригодится WinVersion QSysInfo::windowsVersion () [static], чтобы правильный путь выбрать.
угу

Автор: SABROG 7.4.2010, 22:09

Как я понял сама Qt имеет имена всех файлов и может их соотнести с семейством:

Q_GLOBAL_STATIC(QFontDatabasePrivate, privateDb) 
...
class QFontDatabasePrivate
{
public:
...
struct ApplicationFont {
        QString fileName;
        QByteArray data;
#if defined(Q_OS_WIN)
        HANDLE handle;
        bool memoryFont;
        QVector<FONTSIGNATURE> signatures;
#elif defined(Q_WS_MAC)
        ATSFontContainerRef handle;
#endif
        QStringList families;
    };
    QVector<ApplicationFont> applicationFonts;

К сожалению QFontDatabasePrivate это не d_ptr. Класс определен в .cpp файле и его include в свою программу влечет за собой вставку ненужного кода, но помимо этого еще ничего не собирается. Хаком добраться до него не получается. Похоже единственный вариант это определить копию интерфейса QFontDatabasePrivate и QFontDatabase в своей программе. Вытащить наружу указатель d и сделать reinterpret_cast на экземпляр класса QFontDatabase. Только делать копии интерфейсов большой гемор.
---
Ложный след, так можно достучаться только до тех файлов, которые сам добавил.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)