zoukankan      html  css  js  c++  java
  • Qt 实现 axidraw 仿真

    #include "graphwidget.h"
    
    #include <QGraphicsScene>
    #include <QRectF>
    #include <QPainterPath>
    #include <QtCore/qmath.h>
    #include "base.h"
    
    
    GraphWidget::GraphWidget()
    {
        //设置更新时间,(如果时间太长,也就是更新太慢,当speed太小时会导致更新比鼠标运动还要慢,出错)、
        timerId = startTimer(1000 / 80.0);//设置更新的时间间隔 FRECUENCY = 100
    
        QGraphicsScene *scene = new QGraphicsScene(this);
        scene->setItemIndexMethod(QGraphicsScene::NoIndex);
         scene->setSceneRect(-300, -150, 600, 600);
          setMinimumSize(800, 800);
        setScene(scene);//
        setCacheMode(CacheBackground);
        setViewportUpdateMode(BoundingRectViewportUpdate);
        setRenderHint(QPainter::Antialiasing);
        setTransformationAnchor(AnchorUnderMouse);
        setResizeAnchor(AnchorViewCenter);
    //新增加baseLeft
        baseLeft =new base(this);
        scene->addItem(baseLeft);
        baseLeft->setPos(-300,0);
    
        QGraphicsRectItem  * baserect = new QGraphicsRectItem(-40,-40,80,80);
       baserect->setPen(QPen(Qt::black));
       baserect->setPos(-300,0);
       scene->addItem(baserect);
    
       QGraphicsEllipseItem  * baseRound = new QGraphicsEllipseItem(-30,-30,60,60);
       baseRound->setPen(QPen(Qt::black));
       baseRound->setPos(-300,0);
       scene->addItem(baseRound);
    
    //新增加baseRight
       baseRight =new base(this);
       scene->addItem(baseRight);
       baseRight->setPos(300,0);
    
       QGraphicsRectItem  * baserectbaseRight = new QGraphicsRectItem(-40,-40,80,80);
      baserectbaseRight->setPen(QPen(Qt::black));
      baserectbaseRight->setPos(300,0);
      scene->addItem(baserectbaseRight);
    
      QGraphicsEllipseItem  * baseRoundbaseRight = new QGraphicsEllipseItem(-30,-30,60,60);
      baseRoundbaseRight->setPen(QPen(Qt::black));
      baseRoundbaseRight->setPos(300,0);
      scene->addItem(baseRoundbaseRight);
    
    //新增加centerbase
        centerbase =new  Centerbase(this);
        scene->addItem(centerbase);
        centerbase->setPos(-0,0);
    
    //新增加underbase
        underbase =new  Underbase(this);
        scene->addItem(underbase);
        underbase->setPos(-0,0);
    
    //新增加线条
        for(int i=0;i<8;i++)
        {
            lines[i] = new QGraphicsRectItem();
            lines[i]->setPen(QPen(Qt::black));
            lines[i]->setPos(0,0);
        }
        SetLinesPos(20,20);
        for(int n=0;n<8;n++)
        {
            scene->addItem(lines[n]);
        }
    Drawitems(0,0);
    
    //新增加轨迹
    QGraphicsRectItem  * baserect2 = new QGraphicsRectItem(-100,0,200,160);
    baserect2->setPen(QPen(Qt::blue));
    baserect2->setPos(-0,380);
    scene->addItem(baserect2);
    
    QGraphicsEllipseItem  * baseRound2 = new QGraphicsEllipseItem(-40*2,0,80*2,80*2);
    baseRound2->setPen(QPen(Qt::blue));
    baseRound2->setPos(-0,380);
    scene->addItem(baseRound2);
    
    
    scale(qreal(0.8), qreal(0.8));
    }
    //线条平移距离,相对最初位置
    void GraphWidget::SetLinesPos(qreal x,qreal  y)
    {
        lines[0]->setRect(-300,-30,300-60+x,2);
        lines[1]->setRect(-300,30,300-60+x,2);
        lines[2]->setRect(60+x,-30,300-60-x,2);
        lines[3]->setRect(60+x,30,300-60-x,2);
        lines[4]->setRect(-30+x,-300-y,2,300-60+y);
        lines[5]->setRect(30+x,-300-y,2,300-60+y);
        lines[6]->setRect(-30+x,60,2,300-60-y);
        lines[7]->setRect(30+x,60,2,300-60-y);
    }
    void GraphWidget::Drawitems(qreal x,qreal y)
    {
        centerbase->setPos(x,0);
        underbase->setPos(x,-y);
        SetLinesPos(x,y);
    }
    void GraphWidget::timerEvent(QTimerEvent *event)
    {
        Q_UNUSED(event);
    
        Drawitems(underbase->pos().x(),-underbase->pos().y());
        qreal x =underbase->pos().x();
        qreal y = -underbase->pos().y();
    
        qreal angle1= (x+y)/30.0;
        qreal angle2 = (x-y)/30.0;
        baseLeft->setRotation(angle1*180);
        baseRight->setRotation(angle2*180);
    
        static unsigned int num =0;
        static unsigned int status = 0;
        static unsigned int thresh =100;
        num++;
        if(num>thresh)
        {
             num = 0;
             status++;
        }
        if(status == 0)
        {
            underbase->moveBy(1,0);
        }
    
        if(status == 1)
        {thresh =80;
            underbase->moveBy(0,1);
        }
        if(status == 2)
        {
            underbase->moveBy(0,1);
        }
        if(status == 3)
        {thresh =100;
            underbase->moveBy(-1,0);
        }
        if(status == 4)
        {
            underbase->moveBy(-1,0);
        }
        if(status == 5)
        {thresh =80;
            underbase->moveBy(0,-1);
        }
        if(status == 6)
        {
            underbase->moveBy(0,-1);
        }
        if(status == 7)
        {thresh =100;
            underbase->moveBy(1,0);
        }
        if(status == 8)
        {thresh = 2*3.141592653*80;
            underbase->moveBy(qCos(2*3.141592653*num*1.0/thresh),qSin(2*3.141592653*num*1.0/thresh));
        }
    
    }
     1 #include <QApplication>
     2 #include "mainwindow.h"
     3 #include "graphwidget.h"
     4 
     5 int main(int argc, char *argv[])
     6 {
     7     QApplication a(argc, argv);
     8     GraphWidget w;
     9     w.show();
    10 
    11     return a.exec();
    12 }
     1 #include <QGraphicsScene>
     2 #include <QGraphicsSceneMouseEvent>
     3 #include <QPainter>
     4 #include <QStyleOption>
     5 
     6 #include "underbase.h"
     7 #include "graphwidget.h"
     8 
     9 #include <QtCore/qmath.h>
    10 #include  <qDebug>
    11 
    12 Underbase::Underbase(GraphWidget *graphWidget) : graph(graphWidget)
    13 {
    14     setFlag(ItemIsMovable);
    15             setCacheMode(DeviceCoordinateCache);
    16             setZValue(1);
    17 }
    18 
    19 QRectF Underbase::boundingRect() const
    20 {
    21     return QRectF(-110,-300,220,380+300);
    22 }
    23 
    24 QPainterPath Underbase::shape() const
    25 {
    26     QPainterPath path;
    27     path.addRect(-110,-300,220,380+300);
    28     return path;
    29 
    30 
    31 }
    32 
    33 void Underbase::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *)
    34 {
    35 
    36 //    painter->setPen(Qt::black);
    37 //    //painter->setBrush(Qt::red);
    38 //    painter->drawLine(0,0,30,0);
    39 //painter->drawRect(-100,-100,200,200);
    40 // painter->drawEllipse(-30-60, -30-60, 60, 60);
    41 // painter->drawEllipse(-30-60, -30+60, 60, 60);
    42 // painter->drawEllipse(-30+60, -30-60, 60, 60);
    43 // painter->drawEllipse(-30+60, -30+60, 60, 60);
    44 
    45 
    46  painter->setPen(Qt::black);
    47  //painter->setBrush(Qt::red);
    48 //    painter->drawLine(0,0,30,0);
    49 painter->drawRect(-110,-300,220,360+300);
    50 painter->drawRect(-0,+360,2,20);
    51 painter->drawEllipse(-0-30, 300-30, 60, 60);
    52 painter->setBrush(Qt::black);
    53 painter->drawRect(-110,-300,220,5);
    54 }

  • 相关阅读:
    Java实现 LeetCode 343 整数拆分(动态规划入门经典)
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 342 4的幂
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 341 扁平化嵌套列表迭代器
    Java实现 LeetCode 338 比特位计数
    H264(NAL简介与I帧判断)
    分享一段H264视频和AAC音频的RTP封包代码
  • 原文地址:https://www.cnblogs.com/tangyuanjie/p/6492802.html
Copyright © 2011-2022 走看看