1. 程式人生 > 實用技巧 >Qt 使用QGraphicsItem繪製複雜的圖形

Qt 使用QGraphicsItem繪製複雜的圖形

程式執行截圖如下:

原理:使用QPainter一個部分,一個部分的畫

原始碼:

mygraphicsitem.h

 1 ifndef MYGRAPHICSITEM_H
 2 #define MYGRAPHICSITEM_H
 3  
 4 #include <QGraphicsItem>
 5  
 6 class MyGraphicsItem:public QGraphicsItem
 7 {
 8 public:
 9     MyGraphicsItem(QGraphicsItem *parent=0);
10     ~MyGraphicsItem();
11  
12 protected
: 13 QRectF boundingRect()const; 14 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); 15 }; 16 17 #endif // MYGRAPHICSITEM_H

widget.h

 1 #ifndef WIDGET_H
 2 #define WIDGET_H
 3  
 4 #include <QWidget>
 5 class QGraphicsScene;
 6  
 7 namespace Ui {
8 class Widget; 9 } 10 11 class Widget : public QWidget 12 { 13 Q_OBJECT 14 15 public: 16 explicit Widget(QWidget *parent = 0); 17 ~Widget(); 18 19 private: 20 Ui::Widget *ui; 21 QGraphicsScene *m_scene; 22 }; 23 24 #endif // WIDGET_H

main.cpp

 1 #include "widget.h"
 2 #include <QApplication>
 3
4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 Widget w; 8 w.show(); 9 10 return a.exec(); 11 }

mygraphicsitem.cpp

 1 #include "mygraphicsitem.h"
 2 #include <QPainter>
 3 #include <QPen>
 4 #include <QRectF>
 5  
 6 MyGraphicsItem::MyGraphicsItem(QGraphicsItem *parent):
 7     QGraphicsItem(parent)
 8 {
 9     setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
10 }
11  
12 MyGraphicsItem::~MyGraphicsItem()
13 {
14  
15 }
16  
17 QRectF MyGraphicsItem::boundingRect() const
18 {
19     return QRectF(-14,-50,55,70);
20 }
21  
22 void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
23 {
24     Q_UNUSED(option)
25     Q_UNUSED(widget)
26     painter->setPen(QPen(Qt::white,1));
27     painter->drawRect(-14,-50,55,70);
28     painter->setPen(QPen(Qt::red,2));
29     painter->drawLine(0,0,0,10);
30     painter->drawLine(0,10,30,10);
31     painter->drawLine(30,10,30,0);
32     painter->drawLine(15,10,15,-20);
33     painter->drawLine(15,-20,0,-20);
34     QRectF rectangle(0,-33,30,30);
35     int startAngle=-180*16;
36     int spanAngle=270*16;
37     painter->drawArc(rectangle, startAngle, spanAngle);
38     painter->drawLine(15,-35,15,-40);
39 }

widget.cpp

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include "mygraphicsitem.h"
 4 #include <QGraphicsScene>
 5  
 6 Widget::Widget(QWidget *parent) :
 7     QWidget(parent),
 8     ui(new Ui::Widget)
 9 {
10     ui->setupUi(this);
11     m_scene=new QGraphicsScene;
12     ui->graphicsView->setScene(m_scene);
13     ui->graphicsView->setRenderHint(QPainter::Antialiasing);
14     m_scene->setBackgroundBrush(QBrush(Qt::black));
15     MyGraphicsItem *item=new MyGraphicsItem;
16     item->setPos(0,0);
17     m_scene->addItem(item);
18 }
19  
20 Widget::~Widget()
21 {
22     delete ui;
23 }