2012-04-19 5 views
2

QGraphicsSceneと一緒に働くようにQGraphicsLinearLayoutを取得するのは、QGraphicsItemのグループがシーンに線形に配置されるように苦労しています。すべての項目が依然として互いの上に配置され、代わりに、互いに隣接しているような線形レイアウトによって決定レイアウトに従って(これは動作しないQGraphicsLinearLayoutをQGraphicsSceneと共に正しく使用してQGraphicsItemsを配置する方法は?

#include <QApplication> 
#include <QBrush> 
#include <QGraphicsItem> 
#include <QGraphicsLayoutItem> 
#include <QGraphicsLinearLayout> 
#include <QGraphicsRectItem> 
#include <QGraphicsScene> 
#include <QGraphicsView> 
#include <QGraphicsWidget> 
#include <QPen> 

class MyShape : public QGraphicsRectItem, public QGraphicsLayoutItem { 
    public: 
    MyShape(void) { 
     setPen(QPen(QBrush(Qt::black), 1)); 
     setBrush(QBrush(Qt::green)); 
     setRect(0, 0, 20, 20); 
    } 

    virtual QSizeF sizeHint(Qt::SizeHint which, 
          const QSizeF& constraint = QSizeF()) const { 
     Q_UNUSED(which); 
     Q_UNUSED(constraint); 
     return boundingRect().size(); 
    } 
}; 

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

    QGraphicsScene scene; 
    MyShape* shape1 = new MyShape; 
    MyShape* shape2 = new MyShape; 
    MyShape* shape3 = new MyShape; 
    scene.addItem(shape1); 
    scene.addItem(shape2); 
    scene.addItem(shape3); 

    QGraphicsLinearLayout* layout = new QGraphicsLinearLayout; 
    layout->addItem(shape1); 
    layout->addItem(shape2); 
    layout->addItem(shape3); 

    QGraphicsWidget* container = new QGraphicsWidget; 
    container->setLayout(layout); 
    scene.addItem(container); 

    QGraphicsView view; 
    view.setScene(&scene); 
    view.show(); 

    return app.exec(); 
} 

:Iを以下のアプローチを使用して試しました)。私は間違って何をしていますか?

答えて

2

ああ、私はsetGeometry機能をオーバーライドするのを忘れてしまった!

のでMyShapeクラスの実装は次のようになります。今期待どおりに動作します

class MyShape : public QGraphicsRectItem, public QGraphicsLayoutItem { 
    public: 
    MyShape(void) { 
     setPen(QPen(QBrush(Qt::black), 1)); 
     setBrush(QBrush(Qt::green)); 
     setRect(0, 0, 20, 20); 
    } 

    virtual QSizeF sizeHint(Qt::SizeHint which, 
          const QSizeF& constraint = QSizeF()) const { 
     Q_UNUSED(which); 
     Q_UNUSED(constraint); 
     return boundingRect().size(); 
    } 

    virtual void setGeometry(const QRectF& rect) { 
     setPos(rect.topLeft()); 
    } 
}; 

。 =)

関連する問題