Собираем
информацию
по крупицам

Программирование на C++ и Qt

Qt: как бороться с ошибкой "Point size <= 0 (0), must be greater than 0"
16-06-2011
18:36:50

Многие, кто делает программы на фреймверке Qt 4.x, может натолкнутся на то, что запущенная программа в какой-то момент начинает сыпать бесконечными предупреждениями:

 

[WRN] QFont::setPointSize: Point size <= 0 (0), must be greater than 0

 

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

 

На самом деле проблема не в вашем коде, и не в коде Qt. Проблема в нечетком соблюдении открытых стандартов в разных программах.

 

Дело в том, что вышеуказанное предупреждение появляется только в тот момент, когда в программе начинают использовать SVG-изображения, например для иконок меню. А в чем обычно подготавливают SVG-изображения? Правильно, в Inkscape.

 

Так вот оказывается, что Inkscape (по крайней мере версия 0.47) иногда генерирует некорректный SVG-код. Причем момент, когда будет сгенерирован кривой SVG, предсказать трудно. Это зависит от действий, которые вы совершали при редактировании. Проблема в том, что Inkscape может засунуть недопустимые CSS-свойства в объект, которые эти свойства не должен поддерживать впринципе.

 

Например, изогнутая линия кодируется в XML-коде SVG файла как элемент <path>. В нормальном случае, атрибут style этого элемента будет содержать только данные, применимые к данному элементу, например:

 

<path
 style="color:#000000;
        fill:none;
        stroke:#000000;
        stroke-width:2;
        stroke-miterlimit:4;
        stroke-dasharray:none;
        marker:none;
        visibility:visible;
        display:inline;
        overflow:visible;
        enable-background:accumulate"
 d="m 3.0625,9.4285719 0,-2.9714288 
    c 0,-2.4616123 1.7628789,-4.4571432 3.9375003
    l 0,2.9714288"
 id="path3633"
 sodipodi:nodetypes="ccccc"/>

 

В ненормальном случае, в атрибут style будут включены свойства текста font-..., что для элемента <path> не имеет никакого смысла:

 

<path
 style="font-size:medium;
        font-style:normal;
        font-variant:normal;
        font-weight:normal;
        font-stretch:normal;
        text-indent:0;
        text-align:start;
        text-decoration:none;
        line-height:normal;
        letter-spacing:normal;
        word-spacing:normal;
        text-transform:none;
        direction:ltr;
        block-progression:tb;
        writing-mode:lr-tb;
        text-anchor:start;
        color:#000000;
        fill:#999999;
        fill-opacity:1;
        stroke:none;
        stroke-width:1.99999988;
        marker:none;
        visibility:visible;
        display:inline;
        overflow:visible;
        enable-background:accumulate;
        font-family:Bitstream Vera Sans;"
 d="m 7.0980961,0.90625 
    c -2.6263167,0 -4.777193,
    l 0,2.9687504 1.737161,0 0,-2.9687504"
 id="path3032" />

 

Вот на таком SVG-теге и спотыкается SVG-рендер, встроенный в Qt, и выдает непрекращающийся поток предупреждений.

 

Что можно сделать в данном случае? Я пытался в Inkscape сохранить SVG-картинку в формате "чистого SVG". Это не помогает. Так как у меня оказалась только одна проблемная картинка, я просто руками (ну не руками, а через sed, конечно) удалил все вхождения font-... и text-... в свойстве style элемента <path>.

 

После такого исправления, надоедливые предупреждения в консоли исчезли.

 


К списку "Компьютерное"

Интересное на сайте


C / C++ » LoLo Switcher. Полное руководство по конфигурированию

Это полное руководство к переключателю клавиатуры LoLo Switcher для оконной среды X11. Скачать переключатель можно на официальной странице LoLo S...


Программирование на C++ и Qt » Как в Linux глобально отловить нажания клавиш в X11 (XWindow)

Несколько раз я пытался найти пример кода, который бы позволял отслеживать события нажатия и отжатия клавиш в нашем любимом X-сервере. Важный момент: ...


Скейтборд » Настоящая история скейтбординга. Часть 4: Как изменился скейт после изобретения прыжка Ollie

До изобретения прыжка Ollie, в котором скейт подлетает в воздух вместе с человеком, вес скейта никого особенно не волновал. Деки делали толстыми, част...

RSS подписка

Подпишитесь на новости сайта по RSS


Лучшие дц форекс. Рейтинг брокеров форекс www.obrokerah.ru.
http://www.ezramed.ru/ кселода xeloda.

Внимание!

На этом сайте разрабатывается программа MyTetra и её родственные проекты.

Доступны к просмотру следующие базы знаний:

База Xintrea (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18)

База Rarrugas (1, 2)

База Balas

База YellowRaven

База Yurons

База Lesnik757

База Shandor

База Sirrichar

 

Подробности на странице MyTetra Share.

 WebHamster.Ru
 Домик любопытного хомячка
Яндекс индекс цитирования
Почтовый ящик