我是靠谱客的博主 轻松外套,最近开发中收集的这篇文章主要介绍QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基本图元有:椭圆,多边形,长方形,文字,图片等图元
通过代码演示各种图元的添加:
①主窗口头文(QMainWindow):

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include<QGraphicsView>
#include<QGraphicsEllipseItem>
#include<QGraphicsScene>
#include<QAction>
#include<QMessageBox>
#include<QMenu>
#include<QMenuBar>
#include<QList>
#include<QPen>
#include<QTime>
#include<QGraphicsItemAnimation>
#include<QTimeLine>
#include"flashitem.h"
#include"starmove.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
void initScene();//初始化场景
void createAction();//创建动作
void createMenu();//创建菜单
~MainWindow();
public slots:
void newWindow();//新建一个显示窗口
void clearWindow();//清除窗口
void addEllipse();//添加椭圆图元
void addPolygon();//添加多边形图元
void addText();//添加文本图元
void addRect();//添加长方体
void addButter();//添加图片(蝴蝶)
private:
QGraphicsScene *scene;//场景
QAction *newQAC;//添加新窗口动作
QAction *clearQAC;//清除窗口动作
QAction *quitQAC;//退出动作
QAction *addEllipseQAC;//添加椭圆动作
QAction *addPolygonQAC;//添加多边形动作
QAction *addTextQAC;//添加文本动作
QAction *addRectQAC;//添加长方形动作
QAction *addButterQAC;//添加图片动作
};
#endif // MAINWINDOW_H

源文件:

#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->createAction();//创建动作
this->createMenu();//创建菜单
//设置场景大小
scene=new QGraphicsScene;
scene->setSceneRect(-200,-200,400,400);
this->initScene();//初始化场景
QGraphicsView *view =new QGraphicsView;
view->setScene(scene);
view->setMinimumSize(400,400);
view->show();
this->setCentralWidget(view);
this->resize(550,450);
this->setWindowTitle("GraphicsItem");
}
void MainWindow::newWindow()
{
clearWindow();//清屏
initScene();//初始化
MainWindow *newMainWindow=new MainWindow;
newMainWindow->show();
}
//初始化
void MainWindow::initScene()
{
for(int i=0;i<3;i++)
{
this->addEllipse();
this->addPolygon();
this->addText();
this->addRect();
this->addButter();
}
}
//清屏
void MainWindow::clearWindow()
{
QList<QGraphicsItem*>listItem=scene->items();
while(!listItem.isEmpty())
{
scene->removeItem(listItem.at(0));
listItem.removeAt(0);
}
}
//加入椭圆
void MainWindow::addEllipse()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//随机数种子
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::addPolygon()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//随机数种子
QVector<QPoint>v;
v<<QPoint(30,-15)<<QPoint(30,-15)<<QPoint(3,-15)<<QPoint(-10,-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::addText()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//随机数种子
QFont font("Times",20);
QGraphicsTextItem *item=new QGraphicsTextItem("卧槽");
item->setFont(font);
item->setFlag(QGraphicsItem::ItemIsMovable);//可移动
scene->addItem(item);//添加图元
item->setPos((qrand()%int(scene->sceneRect().width()))-200,(qrand()%int(scene->sceneRect().height())-200));//随机位置
}
//加入长方形
void MainWindow::addRect()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//随机数种子
QGraphicsRectItem *item=new QGraphicsRectItem(QRectF(0,0,60,60));
QPen pen;
pen.setWidth(5);
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::addButter()
{
qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));//随机数种子
QGraphicsPixmapItem *item=scene->addPixmap(QPixmap("://up.png"));
item->setFlag(QGraphicsItem::ItemIsMovable);//可移动
item->setPos((qrand()%int(scene->sceneRect().width()))-200,(qrand()%int(scene->sceneRect().height())-200));//随机位置
}
MainWindow::~MainWindow()
{
}
void MainWindow::createAction()
{
//新建
newQAC=new QAction("新建",this);
newQAC->setShortcut(tr("Ctral+N"));//设置动作快捷键
newQAC->setStatusTip("新建窗口");//提示
connect(newQAC,&QAction::triggered,this,&MainWindow::newWindow);
//清除
clearQAC=new QAction("清除",this);
connect(clearQAC,&QAction::triggered,this,&MainWindow::clearWindow);
//退出
quitQAC=new QAction("退出",this);
connect(quitQAC,&QAction::triggered,
[=]()
{
int ret=QMessageBox::question(this,"question","是否退出?");//提示框
if(ret==QMessageBox::Yes)
{
this->close();
}
});
//添加椭圆
addEllipseQAC=new QAction("添加椭圆",this);
connect(addEllipseQAC,&QAction::triggered,this,&MainWindow::addEllipse);
//添加多边形
addPolygonQAC=new QAction("添加多边形",this);
connect(addPolygonQAC,&QAction::triggered,this,&MainWindow::addPolygon);
//添加文本
addTextQAC=new QAction("添加文本",this);
connect(addTextQAC,&QAction::triggered,this,&MainWindow::addText);
//添加长方形
addRectQAC=new QAction("添加长方形",this);
connect(addRectQAC,&QAction::triggered,this,&MainWindow::addRect);
//添加图片
addButterQAC=new QAction("添加蝴蝶",this);
connect(addButterQAC,&QAction::triggered,this,&MainWindow::addButter);
}
void MainWindow::createMenu()
{
//文件菜单
QMenu *file=this->menuBar()->addMenu("文件");
file->addAction(newQAC);
file->addAction(clearQAC);
file->addAction(quitQAC);
//图元菜单
QMenu *images=this->menuBar()->addMenu("图元");
images->addAction(addEllipseQAC);
images->addAction(addPolygonQAC);
images->addAction(addTextQAC);
images->addAction(addRectQAC);
images->addAction(addButterQAC);
}

②添加闪烁图元:
新增加FlashItem类,基类选择QObject:
闪烁图元实现代码:
头文件:

#ifndef FLASHITEM_H
#define FLASHITEM_H
#include <QObject>
#include<QGraphicsItem>
#include<QPainter>
#include<QTimer>
class FlashItem : public QObject, public QGraphicsItem
{
Q_OBJECT
public:
explicit FlashItem(QObject *parent = nullptr);
QRectF boundingRect() const;//为土元限定区域范围,所有继承QGraphicsItem的自定义图元都要实现此函数
void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget);//重绘函数
void timerEvent(QTimerEvent *);
signals:
public slots:
private:
bool flash;
QTimer *timer;
};
#endif // FLASHITEM_H

源文件:

#include "flashitem.h"
FlashItem::FlashItem(QObject *parent) : QObject(parent)
{
flash=true;//为颜色切换标识符
setFlag(ItemIsMovable);//可移动
startTimer(100);//开始计时器
}
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));//边线黑,线宽0
painter->setBrush(flash?(Qt::red):(Qt::yellow));//根据flash切换红黄两色
painter->drawEllipse(-10,-10,40,40);//绘制与阴影区同大小的椭圆,并错开一定距离达到一定立体效果
}
void FlashItem::timerEvent(QTimerEvent *)
{
flash=!flash;
update();
}

编写完成后,在主窗口头文件添加闪烁类的头文件:

#include"flashitem.h"

并在头文件相应位置添加:

void addFlashItem();//添加闪烁图元
槽函数
QAction *addFlashItemQAC;//添加闪烁图元动作

对新增加的属性实现:
createAction()添加:

//添加闪烁图元
addFlashItemQAC=new QAction("添加闪烁图元",this);
connect(addFlashItemQAC,&QAction::triggered,this,&MainWindow::addFlashItem);

createMenu()函数添加

images->addAction(addFlashItemQAC);

void addFlashItem();//添加闪烁图元的实现

//添加闪烁图元
flashItem->setPos((qrand()%int(scene->sceneRect().width()))-200,(qrand()%int(scene->sceneRect().height())-200));
}

③移动图元的添加
新增starMove的移动类,基类选择QObject
该类头文件实现:

#ifndef STARMOVE_H
#define STARMOVE_H
#include <QObject>
#include<QGraphicsItem>
#include<QPainter>
class starMove : public QObject , public QGraphicsItem
{
Q_OBJECT
public:
explicit starMove(QObject *parent = nullptr);
QRectF boundingRect() const;//为土元限定区域范围,所有继承QGraphicsItem的自定义图元都要实现此函数
void paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget);//重绘函数
signals:
public slots:
private:
QPixmap pix;
};
#endif // STARMOVE_H

源文件的实现:

#include "starmove.h"
starMove::starMove(QObject *parent) : QObject(parent)
{
pix.load(":/up.png");//加载图片
}
QRectF starMove::boundingRect() const
{
return
QRectF(-pix.width()/2,-pix.height()/2,pix.width(),pix.height());
}
void starMove::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,QWidget *widget)
{
painter->drawPixmap(boundingRect().topLeft(),pix);
}

主窗口头文件添加移动类头文件:

#include"starmove.h"

并在头文件添加相应的属性和函数

void addMoveItem();//添加移动图元
QAction *addMoveItemQAC;//添加移动图元动作

对新增加的属性实现:
createAction()添加:

//添加移动图元
addMoveItemQAC=new QAction("添加移动图元",this);
connect(addMoveItemQAC,&QAction::triggered,this,&MainWindow::addMoveItem);

createMenu()函数添加

images->addAction(addMoveItemQAC);

addMoveItem()的实现

//添加移动图元
void MainWindow::addMoveItem()
{
starMove *item=new starMove;
QGraphicsItemAnimation *anim=new QGraphicsItemAnimation;
anim->setItem(item);
QTimeLine *timeLine=new QTimeLine(4000);//持续时间
timeLine->setCurveShape(QTimeLine::SineCurve);//此属性保留时间线曲线的形状(正弦曲线)
timeLine->setLoopCount(5);//此属性保存时间线在运行前应循环的次数
anim->setTimeLine(timeLine);
int y=(qrand()%400)-200;
for(int i=0;i<400;i++)
{
anim->setPosAt(i/400,QPointF(i-200,y));
}
timeLine->start();
scene->addItem(item);
}

最后

以上就是轻松外套为你收集整理的QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加的全部内容,希望文章能够帮你解决QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部