思路
新建场景、图元、和视图。
图元添加到场景,场景与视图关联,视图显示。
初始例子
头文件
#include <QGraphicsScene> //场景:添加图元 void addItem(QGraphicsItem *item)
#include <QGraphicsView> //视图;显示场景
#include <QGraphicsItem> //图元
main.cpp
QGraphicsScene *scene = new QGraphicsScene; //场景
QGraphicsRectItem *item = new QGraphicsRectItem(100,100,50,50); //矩形项
scene->addItem(item); //项添加到场景
QGraphicsView *view = new QGraphicsView; //视图
view->setScene(scene); //视图关联场景
view->resize(500,500);
view->show(); //显示视图
具体操作
新建一个图元类MyItem继承QGraphicsItem,可以实现自定义的图元项
注意需要重写两个虚函数boundingRect()和paint(),不然编译会有错误
myitem.h
#ifndef MYITEM_H
#define MYITEM_H
#include <QGraphicsItem>
class MyItem : public QGraphicsItem
{
public:
MyItem();
QRectF boundingRect() const override;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override;
};
#endif // MYITEM_H
myitem.cpp
#include "myitem.h"
#include <QPainter>
MyItem::MyItem()
{
}
QRectF MyItem::boundingRect() const
{
qreal penWidth = 1;//笔宽
return QRectF(0 - penWidth/2,0-penWidth/2,20+penWidth,20+penWidth);//返回矩形边框(坐标、宽高)
}
void MyItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
//标明该参数没有使用
Q_UNUSED(option)
Q_UNUSED(widget)
painter->setBrush(Qt::green);//用绿色的 笔刷
painter->drawEllipse(0,0,50,50);//画圆
}
效果1:一个绿色的圆形::
main.cpp
#include "widget.h"
#include <QApplication>
#include "animation.h"
#include <QDebug>
#include "myitem.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Widget w;
// w.show();
QGraphicsScene *scene = new QGraphicsScene; //场景
// QGraphicsRectItem *item = new QGraphicsRectItem(100,100,50,50); //矩形项
MyItem *item=new MyItem;//新建图元类对象
scene->addItem(item); //项添加到场景
QGraphicsView *view = new QGraphicsView; //视图
view->setScene(scene); //视图关联场景
view->resize(500,500);
view->show(); //显示视图
return a.exec();
}
效果2:两个绿色的圆形
操作:再定义一个图元类对象,记得修改第二个图元位置(防止与第一个重合)
main.cpp
#include "widget.h"
#include <QApplication>
#include "animation.h"
#include <QDebug>
#include "myitem.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene *scene = new QGraphicsScene; //场景
// QGraphicsRectItem *item = new QGraphicsRectItem(100,100,50,50); //矩形项
MyItem *item=new MyItem;
MyItem *item1=new MyItem;
scene->addItem(item); //项添加到场景
scene->addItem(item1);
item1->setPos(66,66);//设置第二个图元位置
QGraphicsView *view = new QGraphicsView; //视图
view->setScene(scene); //视图关联场景
view->resize(500,500);
view->show(); //显示视图
return a.exec();
}
图元移动
定义advance函数实现移动,需要绑定定时器