Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GUI и шрифты, шрифт из файла 
V
    Опции темы
Artemios
Дата 13.11.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Такая проблема.
Требуется отображать некоторые данные некоторым специфическим шрифтом 
(с возможностью динамического редактирования, т.е. рендеринг в картинку или *.ps не подходит).
Шрифт - в файле (True Type, можно Type 1). 
В систему шрифт ставить нельзя, т.е. надо бы, чтобы программа сама его загрузила из файла и использовала.
В документации по Qt наблюдал только использование шрифтов, прописанных в системе (может не там искал?).

Такое вообще можно реализовать? (желательно конечно в Qt, но на крайний случай можно хоть wx, хоть GTK)



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
J2A
Дата 13.11.2006, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Покажи пример из Qt.

Вообще, идея, IMHO, не очень перспективная (t1python и py-freetype2 выглядят не особо живыми). Проще добавлять шрифты в систему.

Это сообщение отредактировал(а) J2A - 13.11.2006, 13:52
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Artemios
Дата 13.11.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(J2A @  13.11.2006,  13:49 Найти цитируемый пост)
Покажи пример из Qt.

Не совсем понял... Примеры на Qt - в Assistant-е - все, что связано с классом QFont.
На PyQt работать будет точно также. Но для QFont берутся уже поставленные в системе шрифты, например:
Код

# траляля- что-нибудь
    QFont font( "Helvetica" )   # вот :(
    font.setPointSize( 24 )
    font.setWeight( QFont.Bold )
    font.setUnderline( True )
# что-нибудь траляля


Цитата(J2A @  13.11.2006,  13:49 Найти цитируемый пост)
t1python и py-freetype2

хорошо, попробую посмотреть, что это такое  и с чем их едят, только как их прикрутить потом к Qt,
например к какому-нибудь QTextEdit...

Цитата(J2A @  13.11.2006,  13:49 Найти цитируемый пост)
Проще добавлять шрифты в систему.

кто бы спорил.



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
setq
Дата 13.11.2006, 20:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Artemios @  13.11.2006,  14:37 Найти цитируемый пост)
QFont font( "Helvetica" )


Что-то новое в Питоне появилось) [извините, что не в тему]

  Вверх
Artemios
Дата 14.11.2006, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(setq @  13.11.2006,  20:04 Найти цитируемый пост)
Что-то новое в Питоне появилось) [извините, что не в тему]

Да, извиняюсь, спп-шный код не до конца переправил smile 
Код

font = QFont( "Helvetica" )



--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 17.11.2006, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Урра! Ответили тут:
http://forum.vingrad.ru/topic-121190/unrea...tml#entry926574
для интересующихся скопирую сюда:

Цитата(tribunal @  15.11.2006,  17:35 Найти цитируемый пост)
Такая возможность есть!!  smile 
Правда, к сожалению только в новейшем Qt 4.2
вот здесь даже с примером


и вот сам пример (правда на с++), как использовать шрифт, динамически выкачанный из сети:
Код

#include <QtGui>
#include <QtNetwork>
class CoolTextEdit : public QTextEdit
{
    Q_OBJECT
public:
    CoolTextEdit(const QUrl &fontUrl);
private slots:
    void tryDownloadedFont();
private:
    QByteArray downloadedFont;
    QHttp *downloader;
};
CoolTextEdit::CoolTextEdit(const QUrl &fontUrl)
{
    setPlainText("Please wait while downloading font...");
    downloader = new QHttp(this);
    connect(downloader, SIGNAL(done(bool)), this, SLOT(tryDownloadedFont()));
    QBuffer *buffer = new QBuffer(&downloadedFont, downloader);
    downloader->setHost(fontUrl.host());
    downloader->get(fontUrl.path(), buffer);
}
void CoolTextEdit::tryDownloadedFont()
{
    downloader->deleteLater();
    downloader = 0;
    int id = QFontDatabase::addApplicationFontFromData(downloadedFont);
    if (id < 0) {
        setPlainText("Loading the font failed :(");
        return;
    }
    QFont f(QFontDatabase::applicationFontFamilies(id).first());
    f.setPointSize(48);
    setFont(f);
    setPlainText(f.family());
}
int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    CoolTextEdit edit(QUrl("http://fonts.tom7.com/f/actionj.ttf"));
    edit.resize(400, 200);
    edit.show();
    return app.exec();
}
#include "main.moc"


Добавлено @ 01:52 
P.S.
Версия Qt (4.2) критична, так как в 4.1 у класса QFontDatabase еще нет метода addApplicationFontFromData.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
J2A
Дата 17.11.2006, 06:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Ваше счастье, PyQt 4.1 сделан на Qt 4.2, так что пробуйте smile
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Artemios
Дата 17.11.2006, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Цитата(J2A @  17.11.2006,  06:29 Найти цитируемый пост)
Ваше счастье, PyQt 4.1 сделан на Qt 4.2, так что пробуйте smile 

Уже докачиваю smile Как не хотел переходить с 3.5 на 4.*.* , а придется smile 
А почему на "Вы"?


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
J2A
Дата 17.11.2006, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



У PyQt4 ощутимые плюсы по сравнению с PyQt3, хотя бы нормальные пространства имен smile

На "Вы" по инерции, видимо, разговаривал с кем-то.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Artemios
Дата 19.11.2006, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Имеется Qt 4.2.1 , ну и соответствующая PyQt 4.1 под Python 2.5.
ОС - Windows (не пинайте сильно сапогами - лень было в Linux из исходников собирать или заниматся поиском пакетов со свежей версией библиотеки)

Делаю простенький примерчик для описанной выше задачи (использовать неизвестный системе шрифт).
Пишу практически одно и то же на С++ и на Python-е.
На спп 3 файла:
Код

/**  ftextedit.h
**/
#ifndef FTEXTEDIT_H
#define FTEXTEDIT_H
#include <QtGui>

class FTextEdit : public QTextEdit {
    Q_OBJECT
public:
    FTextEdit(const QString &font_filename);
private:
    QByteArray font_data;
};
#endif

Код

/**  ftextedit.cpp
**/
#include "ftextedit.h"

FTextEdit::FTextEdit(const QString &font_filename) {
    QFile file(font_filename);
    file.open(QIODevice::ReadOnly);
    font_data = file.readAll();
    QFontDatabase db_font;
    int font_id = db_font.addApplicationFontFromData(font_data);
    QString font_family(db_font.applicationFontFamilies(font_id).first());
    setFont(QFont(font_family));
}

Код

/**  main.cpp
**/
#include <QApplication>
#include "ftextedit.h"

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    FTextEdit edit(QString("./OrteROOS.ttf"));
    edit.show();
    return app.exec();
}

далее qmake -project , qmake , make -- все прекрасно компилируется и работает просто замечательно, все как надо - красиво набираем символы шрифтом, о существовании которого система не подозревает.

Но если я пишу то же самое на Питоне:
Код

import sys
from PyQt4 import QtCore,QtGui

class FTextEdit(QtGui.QTextEdit):
      def __init__(self,font_filename):
          QtGui.QTextEdit.__init__(self)
          font_file = QtCore.QFile(font_filename)
          font_file.open(QtCore.QIODevice.ReadOnly)
          self.__font_data =  font_file.readAll()
          db_font = QtGui.QFontDatabase()
          font_id = db_font.addApplicationFontFromData(self.__font_data)
          font_family = db_font.applicationFontFamilies(font_id).first()
          self.setFont(QtGui.QFont(font_family))

if __name__ == "__main__":
      app = QtGui.QApplication(sys.argv)
      edit = FTextEdit(QtCore.QString("./OrteROOS.ttf"))
      edit.show()
      sys.exit(app.exec_())

-- интерпретатор в программе ошибок не находит, но при выполнении умирает (дойдя до последней строчки конструктора класса -- setFont) с дружелюбным предложением системы отослать отчет об ошибке товарищу M$ Гейтсу.
А ведь хочется-то на PyQt, и независимо от системы. Что делать? Что не так?

Это сообщение отредактировал(а) Artemios - 19.11.2006, 04:03


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 21.11.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



По-максимуму упростил примерчики, получил следующее:
Код

#include <QtGui>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
    QTextEdit edit;
    int f_id = QFontDatabase::addApplicationFont("./OrteROOS.ttf");
    edit.setFont(QFont(QFontDatabase::applicationFontFamilies(f_id).first()));
    edit.show();
    return app.exec();
}

и один-в-один:
Код

import sys
from PyQt4 import QtCore, QtGui

if __name__ == "__main__":
      app = QtGui.QApplication(sys.argv)
      edit = QtGui.QTextEdit()
      f_id = QtGui.QFontDatabase.addApplicationFont("./OrteROOS.ttf")
      edit.setFont(QtGui.QFont(QtGui.QFontDatabase.applicationFontFamilies(f_id).first()))
      edit.show()
      sys.exit(app.exec_())


Все то же самое: Qt работает, PyQt жестоко убивает интерпретатор на методе setFont.
Поигрался с кодом, пришел к следующим выводам:
1. В PyQt последней версии проблемы со сменой шрифтов -- сколько бы я не задавал системных шрифтов, ошибок не возникает, но и отображение не изменяется; при попытке сменить шрифт на произвольный подгруженный из файла -- процесс умирает. При чем это проблема именно обертки PyQt, в самом Qt все те же команды работают корректно. 
2. Однако в рамках одного шрифта изменение размера/наклона/цвета и т.д. в PyQt претензий не вызывает.

Большая просьба: у кого на *nix уже стоит Qt 4.2 и PyQt 4.1, проверьте пожалуста последний пример (только имя файла шрифта не забудьте поменять).


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
J2A
Дата 21.11.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Попробую, но обещать не буду.
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
Artemios
Дата 21.11.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Заранее спасибо!


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 26.11.2006, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Связался с автором PyQt, вот что он мне ответил:
Цитата

On Wednesday 22 November 2006 9:11 pm, you wrote:
> Good day.
> I found a bug in PyQt.
>
> OS - Windows XP,
> Python ver. 2.5,
> Qt ver. 4.2 for Mingw compiler,
> PyQt ver. 4.1.
>
> Let "any_font_file.ttf" - an any "True Type" font file in current
> directory. The C++ code:
>
> #include <QtGui>
> int main(int argc, char *argv[]) {
>     QApplication app(argc, argv);
>     QTextEdit edit;
>     int f_id = QFontDatabase::addApplicationFont("any_font_file.ttf");
>    
> edit.setFont(QFont(QFontDatabase::applicationFontFamilies(f_id).first()));
> edit.show();
>     return app.exec();
> }
>
> was correctly worked, but its own-to-own translation into Python:
>
> import sys
> from PyQt4 import QtCore, QtGui
> if __name__ == "__main__":
>       app = QtGui.QApplication(sys.argv)
>       edit = QtGui.QTextEdit()
>       f_id = QtGui.QFontDatabase.addApplicationFont("any_font_file.ttf")
>      
> edit.setFont(QtGui.QFont(QtGui.QFontDatabase.applicationFontFamilies(f_id).
>first())) edit.show()
>       sys.exit(app.exec_())
>
> was died (when the interpretator go in edit.setFont(...) ).


That's a bug in your code. Qt will crash if you call first() on an empty 
QStringList. I think you are just being lucky with the C++ version.

> How can I use a font (in PyQt), which wasn't installed into the system?

Obviously you can't use a font if it isn't installed...

Phil


хотя Фил даже не стал разбираться, ведь это:
Цитата

Qt will crash if you call first() on an empty QStringList.

не правда, уже сорок раз перепроверено: список не пустой и первой строкой -- название фонта.
И почему именно Qt will crash, когда именно с Qt проблем нет?

Теперь пытаться все ему по-английски объяснить smile


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Artemios
Дата 29.11.2006, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 405
Регистрация: 14.8.2006
Где: Саратов, Россия

Репутация: 18
Всего: 50



Свои баги нашел сам, но совсем не там, куда Фил указывал.
Элементарно, забыл о питоновском сборщике мусора и временных объектах.
А вот так:
Код

import sys
from PyQt4 import QtCore, QtGui

if __name__ == "__main__":
      app = QtGui.QApplication(sys.argv)
      font_index = QtGui.QFontDatabase.addApplicationFont("./any_font.ttf")
      font_families = QtGui.QFontDatabase.applicationFontFamilies(font_index)
      font_fam = font_families.first()
      font = QtGui.QFont(font_fam)
      edit = QtGui.QTextEdit()
      edit.setFont(font)
      edit.show()
      sys.exit(app.exec_())

все работает очень хорошо и очень правильно!
ура. тему помечаю решенной.


--------------------
fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ]
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0811 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.