日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QGraphicsItem基本图元的添加以及闪烁图元和移动图元的添加

發布時間:2023/12/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_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基本图元的添加以及闪烁图元和移动图元的添加的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。