воскресенье, 11 марта 2012 г.

Странный баг Qt

Для тех кто сталкивался или, может, столкнется с этим.
Имеем виджет, в его перегруженном методе paintevent рисуем с помощью QPainter эллипсы примерно так:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawEllipse(/*здесь параметры*/)
}


* This source code was highlighted with Source Code Highlighter.
Теперь пробуем добавить этот виджет в QGraphicsView, создаем само представление, сцену, через addWidget() получаем указатель на QGraphicsProxyWidget. Пытаемся его повернуть методом setTransform и...
Если мы не выставляем кэширование у прокси виджета в QGraphicsItem::ItemCoordinateCache, то при запуске получаем assert -
"ASSERT: "i >= 0 && i < elementCount()" in file  ..\..\include/QtGui/../../src/qui/painting/qpainterpath.h, line 400"
да и ещё runtime error!
Так будет с флагами QGraphicsItem::ItemCoordinateCache и QGraphicsItem::NoCache, а вот с ItemCoordinateCache всё работает. Но данный флаг снижает качество прорисовки и не всегда его нужно использовать.
Единственное решение, которое нашел - заменить код сверху на следующий:
void Widget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QPainterPath path;
path.addEllipse(/*здесь параметры*/)
painter.drawPath(path);
}


* This source code was highlighted with Source Code Highlighter.
Почему-то такая замена помогает. 

Комментариев нет:

Отправить комментарий