В QGraphicsScene ничего не отображается

#c #qt #qgraphicsview #qgraphicsitem

#c #qt #qgraphicsview #qgraphicsitem

Вопрос:

Я пытаюсь использовать qgraphicsview qgraphicsitem для создания сцены, подобной шахматной.

Я следую официальному примеру, пытаясь создать его, но ничего не отображается. Код практически такой же. Во-первых, мне интересно, является ли мой класс Cell. Поэтому я просто пытаюсь нарисовать прямоугольник. Но там ничего не отображается. Ниже приведен мой код, не мог бы кто-нибудь мне помочь. Я использую Qt 4.7 в Windows 7

Cell.h

 class Cell : public QGraphicsItem
{
    //Q_OBJECT;

public:
    Cell(const QColor amp;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);
};
  

Cell.cpp

 Cell::Cell(const QColor amp;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();

}
  

view.h

 class View : public QFrame
{
    Q_OBJECT

public:
    QGraphicsView *getview() const;

public:
    View(QWidget *parent);
private:
    QGraphicsView *graphicsView;
};
  

view.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();
  

Ответ №1:

Ваш QFrame не является «владельцем» вашего QGraphicsView. Таким образом, у него нет причин отображать представление внутри него.

Просто замените

 graphicsView = new QGraphicsView;
  

с :

 graphicsView = new QGraphicsView(this);
  

И не забудьте изменить размер окна (или установить в коде минимальный размер), иначе вы можете подумать, что это не сработало =)