2014-02-07 4 views
5

Я заметил, что QPainter :: drawText очень грубо работает на Linux при использовании масштабированного отображения окна. Есть ли что-нибудь, что я могу сделать по этому поводу? Я уже проверял, делает ли отключение сглаживания или включенным растровым рендерером, но это не так.Плохое исполнение QPainter :: drawText на Linux

Пример: При использовании размера окна просмотра (450 пикселей, 200 пикселей) размер окна 100 (45000, 20000) и, следовательно, размеры шрифта также увеличены в 100 раз (1400pt), обеспечивая в 30 раз больше текста " hello "занимает около 4 (!) секунд в Linux - как на OpenSuse, так и на Ubuntu.

Те же образцы отображаются в Windows и Mac.

Только для уточнения: хотя размер шрифта увеличен, текст появляется в «нормальном» размере на экране из-за описанного окна < -> отображение видового экрана.

Вот простой пример кода, я использую:

void Widget::paintEvent(QPaintEvent *event) 
{ 
    const int scaleFactor = 100; 

    QPainter painter(this); 

    // Setup font 
    QFont font; 
    font.setPointSize(14*scaleFactor); 
    painter.setFont(font); 

    // Setup mapping 
    painter.setWindow(0, 0, width() * scaleFactor, height() * scaleFactor); 

    // Render the text 
    for (int i = 0; i < 30; i++) 
     painter.drawText(qrand() % (width() * scaleFactor), qrand() % (height() * scaleFactor), "Hello"); 
} 

Любая помощь будет удивительным.

Примечание: Я использую Qt 4.8.5

+0

Вы пытались нанести маску живописцем с помощью 'painter.scale (scaleFactor, scaleFactor);' вместо установки прямоугольника окна? Это имеет значение? – vahancho

+0

Я сделал быстрый тест прямо сейчас. Это не имеет значения. – Fabian

+0

Хорошо. Чем, может быть, вы могли бы подумать о пределе области рисования видимым, который намного меньше, чем 45000x20000px? – vahancho

ответ

1

Неисправность найдена!

Библиотеки разработчиков FontConfig, которые не установлены в моей системе Linux. Это привело к тому, что Qt был построен против XLFD, что, очевидно, не очень хорошо работает с масштабированными сопоставлениями (см. Отчет выше).

После установки FontConfig dev libs и восстановления Qt текст теперь становится визуализированным славным и быстрым. Я также уточнил параметр «-fontconfig» при перестройке Qt, чтобы убедиться, но, согласно ребятам Qt, это не обязательно.

1

Этот вопрос довольно старый, но, как быть Qt ошибка до сих пор, кажется, нерешенной здесь мы идем ...

Не уверен, если это может быть вариант но в двух проектах, в которых я работал, мы реализовали ярлыки, которые сначала визуализировались в виде pimap/image, которое затем было нарисовано. Так что кеширование текста в изображении с прозрачным фоном должно решить проблему.

Я не думаю, что это имеет значение здесь, но вы также можете проверить, оказывает ли QStaticText положительное влияние на производительность в вашем случае.

+0

Хорошая идея. Я проверил это сразу. К сожалению, это не решает проблему. Интересно, что это заканчивается на том же пути рендеринга. Соответствующая разница между Win и Linux, по-видимому, находится в RasterPaintEngine :: drawTextItem(). В Windows этот метод вызывает drawCachedGlyphs(), который копирует кешированный глиф в пространстве экрана. В Linux он использует QPaintEngineEx :: drawTextItem(), который отображает глиф в пространстве окон и, следовательно, * действительно * большой. – Fabian

Смежные вопросы