零基礎開始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一樣拖動了。
好了,這篇就介紹到這裡,如果我們想要使自定義的圖形元素有更多的花樣,我們就要在剛才實現的幾個虛擬函式中增加更多的內容了。精彩在後面,我們下一篇繼續介紹。