程序
主窗口函数(各种图元的显示)
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QGraphicsScene>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
void initScene();
void createActions();
void createMenus();
public slots:
void slotNew();
void slotClear();
void slotAddEllipseItem();
void slotAddPolygonItem();
void slotAddTextItem();
void slotAddRectItem();
void slotAddAlphaItem();
void slotAddFlashItem();
void slotAnimationItem();
private:
QGraphicsScene *scene;
QAction *newAct;
QAction *clearAct;
QAction *exitAct;
QAction *addEllipseItemAct;
QAction *addPolygonItemAct;
QAction *addTextItemAct;
QAction *addRectItemAct;
QAction *addAlphaItemAct;
QAction *addFlashItemAct;
QAction *addAnimItemAct;
};
#endif
.cpp
#include "mainwindow.h"
#include <QGraphicsView>
#include <QMenu>
#include <QMenuBar>
#include <QGraphicsEllipseItem>
#include "flashitem.h"
#include "startitem.h"
#include <QGraphicsItemAnimation>
#include <QTimeLine>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
createActions();
createMenus();
scene=new QGraphicsScene;
scene->setSceneRect(-200,-200,400,400);
initScene();
QGraphicsView *view=new QGraphicsView;
view->setScene(scene);
view->setMinimumSize(400,400);
view->show();
setCentralWidget(view);
resize(550,450);
setWindowTitle("Graphics Items");
}
MainWindow::~MainWindow()
{
}
void MainWindow::createActions()
{
newAct = new QAction(tr("新建"),this);
clearAct = new QAction(tr("清除"),this);
exitAct = new QAction(tr("退出"),this);
addEllipseItemAct = new QAction(tr("加入 椭圆"),this);
addPolygonItemAct = new QAction(tr("加入 多边形"),this);
addTextItemAct = new QAction(tr("加入 文字"),this);
addRectItemAct = new QAction(tr("加入 长方形"),this);
addAlphaItemAct = new QAction(tr("加入 透明图片"),this);
addFlashItemAct =new QAction(tr("加入 闪烁圆"),this);
addAnimItemAct =new QAction(tr("加入 星星"),this);
connect(newAct,SIGNAL(triggered()),this,SLOT(slotNew()));
connect(clearAct,SIGNAL(triggered()),this,SLOT(slotClear()));
connect(exitAct,SIGNAL(triggered()),this,SLOT(close()));
connect(addEllipseItemAct,SIGNAL(triggered()),this,SLOT (slotAddEllipseItem()));
connect(addPolygonItemAct,SIGNAL(triggered()),this,SLOT (slotAddPolygonItem()));
connect(addTextItemAct,SIGNAL(triggered()),this,SLOT (slotAddTextItem()));
connect(addRectItemAct,SIGNAL(triggered()),this,SLOT (slotAddRectItem()));
connect(addAlphaItemAct,SIGNAL(triggered()),this,SLOT (slotAddAlphaItem()));
connect(addFlashItemAct,SIGNAL(triggered()),this,SLOT (slotAddFlashItem()));
connect(addAnimItemAct,SIGNAL(triggered()),this,SLOT (slotAnimationItem()));
}
void MainWindow::createMenus()
{
QMenu *fileMenu = menuBar()->addMenu(tr("文件"));
fileMenu->addAction(newAct);
fileMenu->addAction(clearAct);
fileMenu->addSeparator();
fileMenu->addAction(exitAct);
QMenu *itemsMenu = menuBar()->addMenu(tr("元素"));
itemsMenu->addAction(addEllipseItemAct);
itemsMenu->addAction(addPolygonItemAct);
itemsMenu->addAction(addTextItemAct);
itemsMenu->addAction(addRectItemAct);
itemsMenu->addAction(addAlphaItemAct);
itemsMenu->addAction(addFlashItemAct);
itemsMenu->addAction(addAnimItemAct);
}
void MainWindow::initScene()
{
int i;
for(i=0;i<3;i++)
slotAddEllipseItem();
for(i=0;i<3;i++)
slotAddPolygonItem();
for(i=0;i<3;i++)
slotAddTextItem();
for(i=0;i<3;i++)
slotAddRectItem();
for(i=0;i<3;i++)
slotAddAlphaItem();
for(i=0;i<3;i++)
slotAddFlashItem();
for(i=0;i<3;i++)
slotAnimationItem();
}
void MainWindow::slotNew()
{
slotClear();
initScene();
MainWindow *newWin = new MainWindow;
newWin->show();
}
void MainWindow::slotClear()
{
QList<QGraphicsItem*> listItem = scene->items();
while(!listItem.empty())
{
scene->removeItem(listItem.at(0));
listItem.removeAt(0);
}
}
void MainWindow::slotAddEllipseItem()
{
QGraphicsEllipseItem *item = new QGraphicsEllipseItem(QRectF(0,0,80,60));
item->setPen(Qt::NoPen);
item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAddPolygonItem()
{
QVector<QPoint> v;
v<<QPoint(30,-15)<<QPoint(0,-30)<<QPoint(-30,-15)
<<QPoint(-30,15)<<QPoint(0,30)<<QPoint(30,15);
QGraphicsPolygonItem *item= new QGraphicsPolygonItem(QPolygonF(v));
item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAddTextItem()
{
QFont font("Times",16);
QGraphicsTextItem *item = new QGraphicsTextItem("Hello Qt");
item->setFont(font);
item->setFlag(QGraphicsItem::ItemIsMovable);
item->setDefaultTextColor(QColor(qrand()%256,qrand()%256,qrand ()%256));
scene->addItem(item);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAddRectItem()
{
QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0,0, 60,60));
QPen pen;
pen.setWidth(3);
pen.setColor(QColor(qrand()%256,qrand()%256,qrand()%256));
item->setPen(pen);
item->setBrush(QColor(qrand()%256,qrand()%256,qrand()%256));
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem(item);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAddAlphaItem()
{
QGraphicsPixmapItem *item =scene->addPixmap(QPixmap("image.png"));
item->setFlag(QGraphicsItem::ItemIsMovable);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAddFlashItem()
{
FlashItem *item= new FlashItem;
scene->addItem(item);
item->setPos((qrand()%int(scene->sceneRect().width()))-200,
(qrand()%int(scene->sceneRect().height()))-200);
}
void MainWindow::slotAnimationItem()
{
StartItem*item=new StartItem;
QGraphicsItemAnimation *anim=new QGraphicsItemAnimation;
anim->setItem(item);
QTimeLine *timeLine =new QTimeLine(4000);
timeLine->setCurveShape(QTimeLine::SineCurve);
timeLine->setLoopCount(0);
anim->setTimeLine(timeLine);
int y= (qrand()%400)-200;
for(int i=0;i<400;i++)
{
anim->setPosAt(i/400.0,QPointF(i-200,y));
}
timeLine->start();
scene->addItem(item);
}
闪烁椭圆函数
.h
#ifndef FLASHITEM_H
#define FLASHITEM_H
#include <QObject>
#include <QGraphicsItem>
class FlashItem : public QObject,public QGraphicsItem
{
Q_OBJECT
public:
explicit FlashItem(QObject *parent = nullptr);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
void timerEvent(QTimerEvent *event);
private:
bool flash;
QTimer *timer;
signals:
public slots:
};
#endif
.cpp
#include "flashitem.h"
#include <QPainter>
FlashItem::FlashItem(QObject *parent) : QObject(parent)
{
flash=true;
setFlag(ItemIsMovable);
startTimer(1000);
}
QRectF FlashItem::boundingRect() const
{
qreal adjust=2;
return QRectF(-10-adjust,-10-adjust,43+adjust,43+adjust);
}
void FlashItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->setPen(Qt::NoPen);
painter->setBrush(Qt::darkGray);
painter->drawEllipse(-7,-7,40,40);
painter->setPen(QPen(Qt::black,0));
painter->setBrush(flash?(Qt::red):(Qt::yellow));
painter->drawEllipse(-10,-10,40,40);
}
void FlashItem::timerEvent(QTimerEvent *event)
{
flash=!flash;
update();
}
星星动画函数
.h
#ifndef STARTITEM_H
#define STARTITEM_H
#include <QGraphicsItem>
#include <QPainter>
class StartItem : public QGraphicsItem
{
public:
StartItem();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private:
QPixmap pix;
};
#endif
.cpp
#include "startitem.h"
StartItem::StartItem()
{
pix.load("star.png");
}
QRectF StartItem::boundingRect() const
{
return QRectF(-pix.width()/2,-pix.height()/2,pix.width(),pix.height());
}
void StartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
painter->drawPixmap(boundingRect().topLeft(),pix);
}
效果展示
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e514cefc1d22b1c2313a8358ad9cf54a.gif)