• 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 }
  • 相关阅读:
    ASP.NET 构建高性能网站 架构设计
    ASP.NET 构建高性能网站 架构设计
    Vim和Vi的常用命令
    Vim和Vi的常用命令
    Vim和Vi的常用命令
    【收藏】前端知识体系完整版本
    【收藏】前端知识体系完整版本
    Ubuntu-升级linux软件源,安装vim/五笔
    高阶函数---swift中的泛型介绍(一步步实现Map函数)
    Go基础学习(二)
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13516734.html
Copyright © 2020-2023  润新知