#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);
И не забудьте изменить размер окна (или установить в коде минимальный размер), иначе вы можете подумать, что это не сработало =)