2014-10-06 3 views
0

Я рисую эллипс в своей графической сцене. Когда эллипс наклонен, часть его границы не появляется сразу. После того, как я изменил размер окна или выполнил действие масштабирования или масштабирования в моей графической сцене, граница эллипса обновляется, и я получаю идеальную форму, которая требуется.QGraphicsScene не обновляется сразу

Я определил свою функцию краски для моего эллипса, как:

QPainterPath ellipse; 
ellipse.moveTo(p1.x()+majRadius, p1.y()); 
ellipse.arcTo(boundingRect(), 0 , 360); 
QPen paintpen(Qt::black); 
paintpen.setWidth(1); 
painter->setRenderHint(QPainter::Antialiasing); 
painter->setPen(paintpen); 
painter->save(); 
painter->translate(p1.x(), p1.y()); 
painter->rotate(theta); 
painter->translate(-p1.x(), -p1.y()); 
painter->drawPath(ellipse); 
painter->restore(); 

Определение моего ограничивающего прямоугольника:

return QRectF(p1.x()-majRadius, p1.y()-minRadius, 
       2*majRadius, 2*minRadius).normalized(); 

Я приложил скриншот два случая эллипса: enter image description here

Как решить эту проблему?

ответ

2

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

При изменении некоторого свойства QGraphicsItem, которая имеет влияние на QGraphicsItem::boundingRect() вы должны вызвать QGraphicsItem::prepareGeometryChange не только не update.
См. Документацию по адресу QGraphicsItem::boundingRect.

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

Другая проблема, которую я вижу, заключается в том, что вы спасаете и восстанавливаете художника неправильно. Сохранение должно произойти до того, как вы произнесите какие-либо изменения в живописи (в вашем случае до painter->setRenderHint(QPainter::Antialiasing);) и восстановите его состояние после того, как картина предмета будет завершена (это нормально).

+0

Спасибо, что указали так много ошибок. в документации для перевода и ротации. Приступая к 'preparegeometrychange', я не смог понять, как его использовать, если бы вы могли дать некоторый намек. –

+0

Где я могу назвать функцию« preparegeometrychange »? –

+0

каждый метод, который влияет на 'p1',' majRadius', 'minRadius' и' theta' влияют на 'boundingRect()', поэтому эти методы должны вызывать 'preparegeometrychange'. –

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