Nada se muestra en QgraphicsScene
-
27-10-2019 - |
Pregunta
Estoy tratando de usar el QgraphicsView QgraphicsItem para crear una escena como un ajedrez.
Estoy siguiendo el ejemplo oficial tratando de crearlo, pero no se muestra nada. El código es bastante mismo. Al principio, me pregunto es mi clase celular. Así que solo trato de dibujar un recto. Pero no se muestra nada. A continuación se muestra mi código, ¿alguien podría ayudarme? Estoy usando el QT 4.7 en Windows 7
Celda.
class Cell : public QGraphicsItem
{
//Q_OBJECT;
public:
Cell(const QColor &color,int x, int y);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private:
int x,y;
public:
QColor color;
protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
};
Celular.cpp
Cell::Cell(const QColor &color, int x, int y)
{
this->x=x;
this->y=y;
this->color=color;
setAcceptedMouseButtons(Qt::LeftButton);
}
QRectF Cell::boundingRect() const
{
return QRectF(0,0,30,15);
}
void Cell::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QBrush b=painter->brush();
painter->setBrush(QColor::fromRgb(0,0,255));
painter->drawRect(0,0,30,15);
painter->fillRect(this->boundingRect(),QColor::fromRgb(0,0,255));
painter->setBrush(b);
return;
}
void Cell::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
QGraphicsItem::mouseMoveEvent(event);
this->color=QColor::fromRgb(0,0,0);
update();
}
Ver.h
class View : public QFrame
{
Q_OBJECT
public:
QGraphicsView *getview() const;
public:
View(QWidget *parent);
private:
QGraphicsView *graphicsView;
};
ver.cpp
View::View(QWidget *parent)
:QFrame(parent)
{
graphicsView = new QGraphicsView;
graphicsView->setRenderHint(QPainter::Antialiasing, false);
graphicsView->setOptimizationFlags(QGraphicsView::DontSavePainterState);
graphicsView->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
}
QGraphicsView *View::getview() const
{
return graphicsView;
}
mainwindow.h
class MainWindow : public QWidget
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
void populateScene();
QGraphicsScene *scene;
};
mainwindow.cpp
MainWindow::MainWindow(QWidget *parent) :
QWidget(parent)
{
populateScene();
View *v=new View(0);
v->getview()->setScene(scene);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(v);
setLayout(layout);
}
MainWindow::~MainWindow()
{
}
void MainWindow::populateScene()
{
scene=new QGraphicsScene();
for(int x=0;x<30;x++)
{
for(int y=0;y<20;y++)
{
QGraphicsItem *item=new Cell(QColor::fromRgb(0,255,255),30,15);
item->setPos(QPointF(30,15));
scene->addItem(item);
}
}
}
main.cpp
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
Solución
Su QFrame no "posee" su QGraphicsView. Por lo tanto, no hay razón para que muestre la vista dentro.
Solo reemplazar
graphicsView = new QGraphicsView;
con :
graphicsView = new QGraphicsView(this);
Y no olvide cambiar el tamaño de la ventana (o establecer en el código un tamaño mínimo) de lo contrario, puede pensar que no funcionó =)