1. 程式人生 > >零基礎開始QT繪圖(5)

零基礎開始QT繪圖(5)

上一篇,我們學會了如何在GraphicView上繪製GraphicItem,看起來效果和在Painter上繪製的沒什麼差別,今天我一起來看看他們的差別。我們在上一篇程式碼的基礎上加上幾句簡單的設定,看看效果。

一、讓圖形動起來

#include "mywidget.h"
#include "ui_mywidget.h"

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

    scene=new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);
    QGraphicsRectItem * rect=new QGraphicsRectItem(QRect(20,20,this->width()/2,this->height()/2));
    QGraphicsTextItem *item = new QGraphicsTextItem("GraphicView running here!");
    //設定矩形可以被移動和被選擇
    rect->setFlag(QGraphicsItem::ItemIsMovable);
    rect->setFlag(QGraphicsItem::ItemIsSelectable);
   
       scene->addItem(rect);
       scene->addItem(item);
}

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

沒有加SetFlag前的執行效果如下:
在這裡插入圖片描述
增加之後,很明顯這個矩形是可以被滑鼠選中,成虛線狀態,而且可以被移動,當移動的大於邊界線就會出現滾動條:
在這裡插入圖片描述
當然,這些都是固化了的GraphicItem。其實我們在編寫遊戲或者組態軟體的時候更多的是需要有個性的GraphicItem,那麼下面我們就來自己編寫一個自定義的GraphicItem,來實現我們個性化的“夢想”。

二、定義自己的GraphicItem
首先我們在QT中新增一個類,讓它繼承自GraphicItem,程式碼如下:
標頭檔案

#ifndef CUSTOMGRAPHICITEM_H
#define CUSTOMGRAPHICITEM_H
#include <QPainter>
#include <QGraphicsItem>
  
class CustomGraphicItem:public QGraphicsItem
{
public:
    CustomGraphicItem();
    QRectF boundingRect( ) const;
    void paint(QPainter *painter,
              const QStyleOptionGraphicsItem *option,
              QWidget *widget);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);

};

#endif // CUSTOMGRAPHICITEM_H

cpp檔案:

#include "customgraphicitem.h"

CustomGraphicItem::CustomGraphicItem()
{
    QGraphicsItem::setFlag(QGraphicsItem::ItemIsMovable);
}

QRectF CustomGraphicItem::boundingRect() const
{
    return QRectF(-10, -10, 120, 40);
}

void CustomGraphicItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    QRectF recf=boundingRect();
    QPen pen(Qt::red);
    QBrush brush(Qt::green);
    painter->setPen(pen);
    painter->setBrush(brush);
    painter->drawRoundedRect(recf,5,5);
}

void CustomGraphicItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseMoveEvent(event);
}

void CustomGraphicItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mousePressEvent(event);
}

void CustomGraphicItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
{
    QGraphicsItem::mouseReleaseEvent(event);
}

從程式碼中我們可以發現,我們僅僅做了幾個必要的動作,而且很簡單,那就是實現了幾個GraphicItem的虛擬函式,
boundingRect:必須實現的,它決定了圖形元素的邊界;
paint:必須實現的,它決定了圖形長什麼模樣
mouseMoveEvent:可以選擇不實現,如果你想在拖動的時候有什麼事件完成就必須實現;
mousePressEvent:可以選擇不實現,如果你在滑鼠按下的時候有什麼事件完成就必須實現;
mouseReleaseEvent:可以選擇不實現,如果你在滑鼠放開的時候有什麼事件完成就必須實現;
補充一點,setFlag在自定義類的建構函式中實現與在外部設定一樣,只是在內部實現省去了外部再設定。
我們來看看執行效果:
在這裡插入圖片描述
這樣,我們定義的綠色的倒角矩形就可以像前面我們呼叫的執行緒的GraphICRectItem一樣拖動了。
好了,這篇就介紹到這裡,如果我們想要使自定義的圖形元素有更多的花樣,我們就要在剛才實現的幾個虛擬函式中增加更多的內容了。精彩在後面,我們下一篇繼續介紹。