QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加
生活随笔
收集整理的這篇文章主要介紹了
QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
基本圖元有:橢圓,多邊形,長方形,文字,圖片等圖元
通過代碼演示各種圖元的添加:
①主窗口頭文(QMainWindow):
源文件:
#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:
閃爍圖元實現代碼:
頭文件:
源文件:
#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()添加:
createMenu()函數添加
images->addAction(addFlashItemQAC);void addFlashItem();//添加閃爍圖元的實現
//添加閃爍圖元flashItem->setPos((qrand()%int(scene->sceneRect().width()))-200,(qrand()%int(scene->sceneRect().height())-200)); }③移動圖元的添加
新增starMove的移動類,基類選擇QObject
該類頭文件實現:
源文件的實現:
#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()添加:
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基本图元的添加以及闪烁图元和移动图元的添加的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年编程列入高考_什么是2021年
- 下一篇: 为什么跨浏览器测试很重要?7款跨浏览器测