我正在基于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。
答案 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);
}