• 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 }

  • 相关阅读:
    测试篇 尝了一下net5.0桌面开发
    日志篇 vs的文本替换,剔除引号保留数字 将vs2019更新之后无法用ctrl+d
    测试篇 使用 nuget.exe CLI 创建 nuget 包
    日志篇 博客园的下方的女孩透明的,带点击声音的
    测试篇 c#文件类型关联启动程序
    数学篇 求两条直线的交点,说明过程.
    日志篇 原生git笔记
    测试篇 winform Anchor 怎么临时取消关联,窗口边界和控件关联
    cad.net dll动态加载,插件式架构,在dll查找引用了的dll,查找dll依赖,dll热插拔,加载dll运行出错.
    cad.net 图元反应器,图元事件,要加在提交数据库之后哟
  • 原文地址:https://www.cnblogs.com/tangyuanjie/p/6492802.html
Copyright © 2020-2023  润新知