第7章:AllItems

1,各类Item的使用

2,源码:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    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();

    this->setCentralWidget(view);
    resize(550, 450);
}

MainWindow::~MainWindow()
{
    delete ui;
}



//创建主窗体的所有动作
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(bool)), this, SLOT(slotNew()));
    connect(clearAct, SIGNAL(triggered(bool)), this, SLOT(slotClear()));
    connect(exitAct,  SIGNAL(triggered(bool)), this, SLOT(close()));
    connect(addEllipseItemAct, SIGNAL(triggered(bool)), this, SLOT(slotAddEllipseItem()));
    connect(addPolygonItemAct, SIGNAL(triggered(bool)), this, SLOT(slotAddPolygonItem()));
    connect(addTextItemAct,    SIGNAL(triggered(bool)), this, SLOT(slotAddTextItem()));
    connect(addRectItemAct,    SIGNAL(triggered(bool)), this, SLOT(slotAddRectItem()));
    connect(addAlphaItemAct,   SIGNAL(triggered(bool)), this, SLOT(slotAddA1phaItem()));
    connect(addFlashItemAct,   SIGNAL(triggered(bool)), this, SLOT(slotAddFlashItem()));
    connect(addAnimItemAct,    SIGNAL(triggered(bool)), this, SLOT(slotAddAnimationItem()));
}





//创建主菜单标题栏
void MainWindow::createMenus()
{
    QMenu *fileMenu = ui->menuBar->addMenu(tr("文件"));
    fileMenu->addAction(newAct);
    fileMenu->addAction(clearAct);
    fileMenu->addSeparator();
    fileMenu->addAction(exitAct);

    QMenu *itemsMenu = ui->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=0;
    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++)
    {
        slotAddA1phaItem();
    }

    for (i=0; i<3; i++)
    {
        slotAddFlashItem();
    }

    for (i=0; i<3; i++)
    {
        slotAddAnimationItem();
    }
}


//显示一个新窗体
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::slotAddA1phaItem()
{
    QGraphicsPixmapItem *item = scene->addPixmap(QPixmap(":/image/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::slotAddAnimationItem()
{
   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);
}
#include "startitem.h"

StartItem::StartItem()
{
    pix.load(":/image/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);
}

#include "flashitem.h"

FlashItem::FlashItem(QObject *parent) : QObject(parent)
{
    flash = true;           //为颜色切换标识赋初值

    setFlag(ItemIsMovable); //设置图元的属性, 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;

    this->update();
}

3,效果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ksmtnsv37297/article/details/86613836