基本图元有:椭圆,多边形,长方形,文字,图片等图元
通过代码演示各种图元的添加:
①主窗口头文(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_OBJECTpublic: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));//边线黑,线宽0painter->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基本图元的添加以及闪烁图元和移动图元的添加相关推荐

  1. Qt (高仿Visio)流程图组件开发(三) 图元基类如何定义,流程图多种图元类型实现

    文章目录 本系列目录 前言 一.图元基类的定义 1.图元信息基类结构体 2.图元位置 3.父子对象关系 二.自定义图元实现 1.自定义图元基类(FlowchartGraphicsItem)与Qt原生图 ...

  2. R语言可视化分面图、假设检验分组t检验、可视化单变量分组分面箱图(faceting bar plot)、添加误差条(error bar)、添加p值、添加抖动数据点(jitter points)

    R语言可视化分面图.假设检验分组t检验.可视化单变量分组分面箱图(faceting bar plot).添加误差条(error bar).添加p值.添加抖动数据点(jitter points) 目录

  3. R语言可视化分面图、单变量分组多水平t检验并指定参考水平、可视化单变量分组多水平分面箱图(faceting boxplot)并添加显著性水平、指定显著性参考水平、添加抖动数据点

    R语言可视化分面图.单变量分组多水平t检验并指定参考水平.可视化单变量分组多水平分面箱图(faceting boxplot)并添加显著性水平.指定显著性参考水平.添加抖动数据点 目录

  4. kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡

    本文首发于烂泥行天下. 前几篇文章介绍了有关KVM安装虚拟机以及如何给虚拟机添加硬盘,今天我们再来介绍下有关如何给KVM虚拟机添加网卡. 给KVM虚拟机添加网卡,可以分为两种形式:图形界面的和virs ...

  5. QQ浏览器如何添加并进入书签地址?QQ浏览器添加并进入书签地址的方法

    打开手机"QQ浏览器"应用进入. QQ浏览器如何添加并进入书签地址?QQ浏览器添加并进入书签地址的方法[多图] 进入主界面,选择或者搜索一个网页进入. QQ浏览器如何添加并进入书签 ...

  6. PHP实现给视频加图片水印,怎么在视频画面上加图片?如何给视频添加自己的图片作为水印?视频添加图片水印的方法...

    今天就是周一啦,昨天周末大家有没有跟好友去玩呢~反正小编是跟同学聚会去了,聚会主题:胖.哈哈哈,不过小编可不跟他们一样只会长胖,小编可是瘦瘦瘦的呢,偷偷的告诉你们,小编减肥瘦了三十斤哦,嘻嘻.好啦,废 ...

  7. vue-aMap高德地图的应用(添加覆盖物点坐标、自定义图标、添加信息窗体信息等)

    vue-aMap高德地图的应用(添加覆盖物点坐标.自定义图标.添加信息窗体信息等) 最近在项目开发中用到了aMap高德地图,简单记录一下,话不多说,直接上代码. 官方文档参考:高德地图aMap官方文档 ...

  8. magento添加sku_快速提示:如何将优惠券添加到Magento电子商务商店

    magento添加sku Say you want to run a promotional offer on your Magento eCommerce store; or to give pro ...

  9. Windows添加网络位置向导(即我的电脑中添加网络盘符)

    Windows添加网络位置向导(即我的电脑中添加网络盘符) 简介 添加方法 网络位置格式 简介 概括来说,所谓的网络位置,是指一个主机上的一个盘符.比如,将IP地址为192.128.1.1的主机上的一 ...

最新文章

  1. 全卷积目标检测:FCOS
  2. 后台判断ajax请求的请求后字段 。
  3. redis可以存多少条数据_在银行存50万元,一年能有多少利息?不工作可以吗?...
  4. ip在线代理网页联合早报_一次免费代理ip的爬取实战
  5. 5_1 大理石在哪儿(UVa10474)排序与查找
  6. 用python做舆情分析系统_如何用Python做舆情时间序列可视化?
  7. potel99se 文件损坏修复
  8. softice使用(1)- 在VMware Workstation 中使用SoftICE zz xfocus
  9. 数据挖掘基础学习笔记
  10. 字节跳动加持游戏产业-千氪
  11. 第5章 SIM卡锁定PIN解锁流程
  12. 【vscode】MarkDown 插入视频标签
  13. 激活office时出现空白框的解决方法
  14. 浏览器网页视频怎么快速下载到本地?
  15. Cocos Creator 基于 Spine 动画的 AVATAR 换装系统优化
  16. TM影像各波段及波段组合情况
  17. 数据库常见问题:服务器'SQL SERVER'上的 MSDTC 不可用
  18. android盒子 小米遥控,小米盒子遥控器手机版下载-小米盒子遥控器appv6.0.0 安卓版 - 极光下载站...
  19. 如何进入bios界面
  20. RTC保存年份不正确的问题排查及解决

热门文章

  1. 第5章 - 二阶多智能体系统的协同控制 --> 连续时间系统编队控制
  2. 2018年的学习任务
  3. 英语句子成分和词类的关系
  4. 视频教程-软考系统集成项目管理工程师视频教程(法律法规)-软考
  5. Font ‘default‘ does not have a glyph for ‘-‘ [U+2212], substituting with a d简单解决问题
  6. 国外企业电子邮箱大全,国外用邮箱哪个好?怎么注册国外邮箱?
  7. win7 修复计算机 黑屏,拯救黑屏 Win7系统引导文件丢失修复教程
  8. Google浏览器清理缓存
  9. 尔宾团队角色(Belbin Team Roles),亦被称为贝尔宾团队角色表(Belbin Team Inventory)
  10. JavaScript动态显示鼠标移动轨迹