Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Размер QFont 
:(
    Опции темы
math64
Дата 3.2.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Как задать высоту QFont, чтобы текст влез в заданный прямоугольник?
PM   Вверх
Amp
Дата 3.2.2013, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



PM MAIL   Вверх
math64
Дата 4.2.2013, 07:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Это под WinAPI. А мне нужно под Qt. Вывожу строку из одного символа. И обрезать межсторочный и межсимвольный интервал.
Код

        uint c = 0x1F0A1;
        QString s = QString::fromUcs4(&c, 1);
        QFont font ("Quivira", ?);
        painter.setBrush(Qt::white);
        painter.setPen(Qt::NoPen);
        painter.drawRect(x, y, w, h);
        painter.setPen(Qt::black);
        painter.setFont(font);
        painter.drawText(?, ?, s);

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Цитата(math64 @  4.2.2013,  07:49 Найти цитируемый пост)
Это под WinAPI. А мне нужно под Qt.

Смысл тот же. Вычисляется прямоугольник в который вписывается текст для некоторого размера шрифта и потом подбирается коэфициент в соответствии с которым размер шрифта меняется.
PM MAIL   Вверх
math64
Дата 4.2.2013, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Теоретически это понятно, но практически не работает - иначе бы не стал открывать тему. Приходится подбирать магические константы, которые при изменении размера окна уже не подходят.
PM   Вверх
Amp
Дата 4.2.2013, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Переписал быстренько на питоне, вроде как надо работает:

Код

def paintEvent(self, event):
    painter = QPainter()

    text = "Ololo ololo ololo"
    rect = self.rect()
    font = QFont()

    painter.begin(self)
    
    font.setPointSize(rect.height() * float(72) / self.logicalDpiY())
    painter.setFont(font)

    text_rect = painter.fontMetrics().boundingRect(text)

    if text_rect.width() > rect.width():
        font.setPointSize(float(rect.width()) / text_rect.width() * font.pointSize())
        painter.setFont(font)

    painter.drawText(rect, Qt.AlignCenter, text)
    
    painter.end()


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  fit_text_test.png 20,56 Kb
PM MAIL   Вверх
math64
Дата 4.2.2013, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Мне почему-то приходится умножать высоту на 2 чтобы получилось правильно:
Код

        uint c = 0x1F0A1;
        QString s = QString::fromUcs4(&c, 1);
        painter.setBrush(Qt::white);
        painter.setPen(Qt::NoPen);
        painter.drawRect(x, y, w, h);
        painter.setPen(Qt::black);
        QFont font("Quivira");
        font.setPointSize(h*72/logicalDpiY());
        painter.setFont(font);
        QRect r = painter.fontMetrics().boundingRect(s);
        if (r.height() > h) {
            font.setPointSize(font.pointSize()*h*2/r.height());
            painter.setFont(font);
        }
        QRect r2 = painter.fontMetrics().boundingRect(s);
        qDebug() << w << h << r << r2;
        painter.drawText(x - r2.left(), y + h, s);

Вывод qDebug:
74 134 QRect(6,-131 47x184) QRect(9,-189 67x265)

PM   Вверх
Amp
Дата 4.2.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Ты карточную колоду что ли фонтами делаешь?
PM MAIL   Вверх
math64
Дата 4.2.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Да, на устройстве с чёрно-белым экраном - обычные PNG плохо смотрятся и масштабируются, а QPicture там нет.
PM   Вверх
Amp
Дата 4.2.2013, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Так чего бы svg не взять?
PM MAIL   Вверх
math64
Дата 4.2.2013, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



svg там тем более нет - видно сразу - нет соответствующего заголовочного файла. Разве что взять исходники и откомпилировать самому. QGraphicsView тоже нет - сначала хотел просто QSoloCards перекомпилировать.
PM   Вверх
Amp
Дата 5.2.2013, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 7
Всего: 17



Можешь сконвертировать символ в QPainterPath и работать уже как с вектором. Если выводить именно как текст, то скорее всего необходимо будет учитывать значения base/descender/ascender lines,  bearing left/right и т.п., чтобы сделать все "впритык". И, возможно, для совсем уж pixel perfect подгонки алгоритм будет итерационным.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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