Собираем
информацию
по крупицам
Статьи - Компьютерное

Программирование на 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>.

 

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

 



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

Поделиться этой страницей


Лучшие дц форекс. Рейтинг брокеров форекс www.obrokerah.ru.

Статистика


RSS подписка

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


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