生活随笔
收集整理的這篇文章主要介紹了
创建图元
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
創(chuàng)建圖元
- 程序
- 主窗口函數(shù)(各種圖元的顯示)
- 閃爍橢圓函數(shù)
- 星星動畫函數(shù)
- 效果展示
程序
主窗口函數(shù)(各種圖元的顯示)
.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
);
}
閃爍橢圓函數(shù)
.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();
}
星星動畫函數(shù)
.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
);
}
效果展示
總結(jié)
以上是生活随笔為你收集整理的创建图元的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。