Возникла потребность разместить в QGraphicsGridLayout набор произвольных QGraphicsItem
В QGraphicsLayout можно разместить только QGraphicsLayoutItem.
Вот класс MyGraphicsLayoutItem для размещения любого элемента QGraphicsItem в QGraphicsLayout
#ifndef MYGRAPHICSLAYOUTITEM_H
#define MYGRAPHICSLAYOUTITEM_H
#include <QtGui>
class MyGraphicsLayoutItem : public QGraphicsRectItem, public QGraphicsLayoutItem
{
public:
MyGraphicsLayoutItem(QGraphicsScene *scene)
: QGraphicsRectItem(0, scene)
{
}
virtual ~MyGraphicsLayoutItem()
{
}
virtual void setGraphicsItem(QGraphicsItem *item)
{
QGraphicsLayoutItem::setGraphicsItem(item);
}
virtual void setGeometry(const QRectF &r)
{
setRect(r);
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget);
const QRect r = option->rect.adjusted(0, 0, -1, -1);
painter->save();
painter->setBrush(QColor(255, 0, 0, 70));
painter->setPen(QColor(Qt::red));
painter->drawRect(r);
painter->restore();
}
protected:
QSizeF sizeHint(Qt::SizeHint which, const QSizeF& constraint = QSizeF()) const
{
Q_UNUSED(which);
Q_UNUSED(constraint);
return QSizeF();
}
};
#endif // MYGRAPHICSLAYOUTITEM_H
При добавлении в QGraphicsGridLayout QGraphicsWidgets элементы расположены нормально по сетке, а при добавлении MyGraphicsLayoutItem они сбиваются в первой ячейке.
QGraphicsGridLayout *layout = new QGraphicsGridLayout;
layout->setSpacing(10);
QGraphicsWidget *form = new QGraphicsWidget;
form->setLayout(layout);
scene->addItem(form);
int count = 20;
int r = count / (count / 10);
r = 5;
for (int i=0; i<count; ++i) {
if(0){
QGraphicsWidget *pushButton = scene->addWidget(new QPushButton(QString("%1").arg(i)));
layout->addItem(pushButton, i % r, i / r);
}else{
QGraphicsTextItem *gText = new QGraphicsTextItem(QString("%1").arg(i));
gText->setDefaultTextColor(Qt::blue);
MyGraphicsLayoutItem *mLayoutItem = new MyGraphicsLayoutItem(scene);
mLayoutItem->setGraphicsItem(gText);
layout->addItem(mLayoutItem, i % r, i / r, Qt::AlignCenter);
}
}
Подскажите, как можно решить данную проблему.