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();
¿Fue útil?

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ó =)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top