当QDeclarativeItem上的X,Y不为0时,QPainter :: drawImage()剪辑QImage

时间:2014-05-19 01:10:07

标签: c++ qt qml qpainter

我正在基于this sample code在C ++中开发一个新的QML元素。我的类继承自QDeclarativeItem,它的paint()方法负责在屏幕上绘制QImage

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    // image is QImage* that was loaded at the constructor of the class
    painter->drawImage(0, 0, *image);
}

小部件大小为800x480,图像为400x240。 只要图纸从(0,0)开始,下面的代码就能完美运行,如下所示:

我面临的问题是在任意坐标(如(200,0))上绘图似乎会剪切绘图。看起来 QPainter 仅从(0,0)开始更新屏幕:

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    painter->drawImage(200, 0, *image);
}

以下是结果:

我目前的解决方法是在widget->update()结束时调用paint()。当然,这很糟糕,因为它会使小部件被绘制两次。

处理此问题的正确方法是什么?我目前在Windows上使用Qt 5.2。

1 个答案:

答案 0 :(得分:2)

I found out在这些情况下,您需要致电prepareGeometryChange() 让父母知道您的小部件的大小/位置已更改,并且需要查询新几何体能够正确地将其绘制到屏幕上。

这将使 parent 在您的小部件上调用boundingRect(),因此您有责任实施它:

void NewQMLitem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    prepareGeometryChange()
    painter->drawImage(200, 0, *image);
}

QRectF NewQMLitem::boundingRect() const
{
    return QRectF(m_x, m_y, m_width, m_height);
}