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 }
原文地址:https://www.cnblogs.com/ybqjymy/p/13516734.html