[QQuickPaintedItem] Problem with drawing text and lines
-
Hello,
I have a subclass of QQuickPaintedItem and paint method is quite simple
@
//setRenderTarget(QQuickPaintedItem::FramebufferObject );
painter->setRenderHint(QPainter::TextAntialiasing);
painter->setRenderHint(QPainter::Antialiasing);
QPen pen(Qt::black, 1, Qt::SolidLine, Qt::FlatCap, Qt::MiterJoin);painter->setPen(pen); painter->setBrush(Qt::NoBrush); painter->drawLine(100, 10, 100, 200); painter->drawLine(10, 50, 107, 50); painter->drawText(50, 40, "some text");
@
The problem here is that with FramebufferObject render target the text is ok but lines width is not 1. If I change render target to Image(default), the text looks ugly but the lines are ok. Any thoughts how to fix that?
!http://i.imgur.com/6iJ4VDy.png()!
!http://i.imgur.com/AUETJKr.png()!Thanks a lot,
Maxim -
It's possible to use Imgae for drawing, something like that
@
void paint(QPainter *painter)
{
QImage image(width(), height(), Image::Format_ARGB32_Premultiplied);
QPainter imagePainter(&image);draw(imagePainter); painter->drawImage(image);
}
@But I'm not sure about performance with this approach
-
To get the lines to draw right you must use float coordinates and snap them to pixel center.
Instead of
@painter->drawLine(100, 10, 100, 200);@
do
@painter->drawLine(100+0.5, 10+0.5, 100+0.5, 200+0.5);@
If it still looks blurry, it is because your item coords are not snapped to pixel bounds. This is, make sure you round your x and y pos (of the item itself) to an int.
DISCLAIMER all this comes from a ton of exp with GraphicsView framework, but it should apply to qquick as well, because it is how (Antialiased) drawing works - you must pixel align.
-
Yep, thanks a lot. I've tried float coordinates but it didn't help. But I found that if I disable antialiasing (remove this line painter->setRenderHint(QPainter::Antialiasing); ), the line looks ok.