2010-05-03 10 views
0

Как именно я могу подклассировать QGraphicsLayoutItem? Я пишу класс, что подкласс QGraphicsLayoutItem и reimplement sizeHint и setGeometry, но когда я добавляю свой пользовательский элемент в линейный или сетчатый макет. Это не показано? Что не хватает?Подкласс QGraphicsLayoutItem

Вот мой суд.

//basicitem.h 
#include <QGraphicsWidget> 
#include <QtCore/QRectF> 
#include <QtGui/QPainter> 
#include <QtGui/QBrush> 
#include <QtGui/QPen> 
#include <QtCore/QSizeF> 

class BasicItem : public QGraphicsWidget 
{ 
public: 
BasicItem(qreal x1,qreal y1,qreal x2,qreal y2); 
~BasicItem(); 
QRectF boundingRect() const; 
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); 
QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; 
private: 
    qreal x1,y1,x2,y2; 
}; 

//basicitem.cpp 
#include "basicitem.h" 
#include <math.h> 
BasicItem::BasicItem(qreal x1, qreal y1, qreal x2, qreal y2) 
{ 
this->x1 = x1; 
this->y1 = y1; 
this->x2 = x2; 
this->y2 = y2; 
} 
BasicItem::~BasicItem() 
{ 
} 
QRectF BasicItem::boundingRect() const 
{ 
    return QRectF(x1,y1,abs(x2-x1),5); 
} 
void BasicItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) 
{ 
    Q_UNUSED(option); 
    Q_UNUSED(widget); 
    painter->setRenderHint(QPainter::Antialiasing); 
    painter->setPen(QPen(QBrush(Qt::yellow),4,Qt::SolidLine,Qt::FlatCap,Qt::BevelJoin)); 
painter->drawLine(x1,y1,x2,y2); 
} 

QSizeF BasicItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const 
{ 
    Q_UNUSED(which); 
    Q_UNUSED(constraint); 
    return QSizeF(abs(x2-x1),5); 
} 

//compositeitem.h 
#include <QGraphicsItemGroup> 
#include <QGraphicsLayoutItem> 
#include <QSizeF> 
#include <QList> 

#include "basicitem.h" 

class CompositeItem:public QGraphicsItemGroup,public QGraphicsLayoutItem 
{ 
    public: CompositeItem(QList<BasicItem *> children); 
    ~CompositeItem(); 
    QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const; 
    void setGeometry(const QRectF &rect); 
    void updateGeometry(); 
}; 

//compositeitem.cpp 
#include "compositeitem.h" 
CompositeItem::CompositeItem(QList<BasicItem *> children) 
{ 
    BasicItem *child; 
    foreach(child,children) 
    { 
     addToGroup(child); 
    } 
} 
CompositeItem::~CompositeItem() 
{ 
} 
QSizeF CompositeItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const 
{ 
    Q_UNUSED(which); 
    Q_UNUSED(constraint); 
    //Arbitrary values but big enough 
    return QSizeF(300,300); 
} 

void CompositeItem::setGeometry(const QRectF &rect) 
{ 
    Q_UNUSED(rect); 
    QGraphicsLayoutItem::setGeometry(QRectF(0,0,300,300)); 
} 

void CompositeItem::updateGeometry() 
{ 
    QGraphicsLayoutItem::updateGeometry(); 
} 

//mainwindow.cpp - important parts 
... 
QGraphicsScene *scene = new QGraphicsScene; 
ui->graphicsView->setScene(scene); 
BasicItem *basic1 = new BasicItem(10,400,110,400); 
BasicItem *basic2 = new BasicItem(10,400,110,500); 
QList<BasicItem *> basicItemList; 
basicItemList.push_back(basic1); 
basicItemList.push_back(basic2); 
CompositeItem *ci = new CompositeItem(basicItemList); 
QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; 
layout->addItem(ci); 
QGraphicsWidget *container = new QGraphicsWidget; 
container->setLayout(layout); 
scene->addItem(container); 
... 
+1

документация Qt предлагает переопределять метод updateGeometry. Если это не поможет, можете ли вы предоставить нам образец вашего кода? – Lohrun

+0

@onurozcelik: Это будет лучше, если вы разместите здесь свой пример кода, который не работает. – mosg

+0

Привет, простите меня, но добавление кода в комментарии не является хорошим решением, потому что оно совсем не читается. Лучше отредактировать свой первый пост (ваш первый вопрос) и добавить там код. – mosg

ответ

0

Может быть, это будет полезно, лишь небольшой пример из моего рабочего проекта:

GraphicsLayoutItem::GraphicsLayoutItem(QGraphicsItem *parent) : 
QGraphicsItemGroup(parent), 
QGraphicsLayoutItem(), 
{ 

addToGroup(item_); 
addToGroup(text_item_); 

setGraphicsItem(this); 
} 

GraphicsLayoutItem::~GraphicsLayoutItem() 
{ 
removeFromGroup(item_); 
removeFromGroup(text_item_); 

delete item_; 
delete text_item_; 

setGraphicsItem(0); 
} 

void GraphicsLayoutItem::setGeometry(const QRectF &r) 
{ 
prepareGeometryChange(); 
QGraphicsLayoutItem::setGeometry(r); 
setPos(r.topLeft()); 
} 

QRectF GraphicsLayoutItem::boundingRect() const 
{ 
return QRectF(QPointF(0, 0), geometry().size()); 
} 

QSizeF GraphicsLayoutItem::sizeHint(Qt::SizeHint which, const QSizeF &constraint) 
const 
{ 

switch (which) 
{ 
    case Qt::MinimumSize: 
    case Qt::PreferredSize: 
     return this->boundingRect().size(); 

    case Qt::MaximumSize: 
     return QSizeF(parentItem()->boundingRect().width(), 
       MyOptions::DefaultHeight); 

    default: 
     return this->boundingRect().size(); 
} 

return constraint; 
}