PDA

View Full Version : QGraphicsLayoutItem updateGeometry



walla74
24th November 2016, 16:01
Hi,
I created graphicsview with vertical layout. So, each item in layout has equal size.Next, I need to repositioning items based on its pixmap size.
How to achieve this?
Simple example, that doesn't work. Item layout not updating properly.


#include <QApplication>
#include <QtWidgets>

class Item : public QGraphicsPixmapItem,
public QGraphicsLayoutItem
{
public:
Item(QGraphicsItem *parent =0): QGraphicsPixmapItem(parent),
QGraphicsLayoutItem(0, false)
{}
virtual QSizeF sizeHint(Qt::SizeHint, const QSizeF&) const
{
return QSize(500,500);
}
virtual void paint( QPainter* painter,const QStyleOptionGraphicsItem * o, QWidget* w) {
painter->setBrush(Qt::white);
painter->drawRect(boundingRect());
QGraphicsPixmapItem::paint(painter,o,w);
}
virtual void setGeometry(const QRectF &rect)
{
prepareGeometryChange();
QGraphicsLayoutItem::setGeometry(rect);
setPos(rect.topLeft());
}
virtual void updateGeometry() {
QGraphicsLayoutItem::updateGeometry();
}
virtual QRectF boundingRect() const
{
return QRectF(QPointF(0,0), geometry().size());
}
};


int main(int argv, char *argc[])
{
QApplication app(argv, argc);

QGraphicsView view;
QGraphicsScene * scene= new QGraphicsScene();
view.setScene(scene);
QGraphicsWidget * widget = new QGraphicsWidget;
QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
widget->setLayout(layout);
scene->addItem(widget);
QList<Item*> items;
for(int i=0; i<10; i++) {
Item *item = new Item();
items.insert(i,item);
scene->addItem(item);
layout->addItem(item);
}
// data
QImage im("cat.jpg");
qDebug() << im.size(); // QSize(960, 708)
for(int i=0; i<5; i++){
items.at(i)->setPixmap(QPixmap::fromImage(im));
items.at(i)->updateGeometry(); // what?
}

view.show();

return app.exec();
}