在QT中将Line的一端定位在Circle上

时间:2017-03-02 15:14:35

标签: c++ qt qt5

所以我需要重新创建雷达类型的效果。我的屏幕中央有一个点,另一个点到达我的雷达屏幕的边缘。

我想使用QDial来控制我的第二个点的位置。

我只是不确定我需要使用的数学来保持第二个点被锁定,可以这么说,在QDial移动它时屏幕的边缘。

提前致谢。

[添加信息]

所以这就是我如何将这一行添加到我的场景中。将线条的角度绑定到我的QDial可以完美地处理所有数学运算,但是每次转动表盘时它会过度拉动另一条线,而不是仅仅调整一条线的角度。

void Radar::drawMainLine(){
     QPainter linePainter;
     linePainter.begin(this);
     linePainter.setRenderHint(QPainter::Antialiasing);

     QPen mainline(Qt::yellow);
     mainline.setWidth(3);

     QLineF line (QPointF(400,400), QPointF(0,0) );
     line.setAngle(m_QDial_rotation);

     m_RadarScene->addLine(line, mainline);
   }

如何调整我的一行角度?

我看到我应该只能影响该行的一个端点的位置,但我认为这将使我回到需要算法以处理其位置的路径。

2 个答案:

答案 0 :(得分:1)

例如,您可以在名为m_line的QLine上创建指针。这个指针将包含当前行,一旦你想移动你可以做一个removeItem的行(我猜你的雷达是QGraphicsScene),然后添加新行。 那样:

 void Radar::drawMainLine(){
         QPainter linePainter;
         linePainter.begin(this);
         linePainter.setRenderHint(QPainter::Antialiasing);

         QPen mainline(Qt::yellow);
         mainline.setWidth(3);

         QLineF *line = new QLine(QPointF(400,400), QPointF(0,0) );
         line->setAngle(m_QDial_rotation);
         if (m_line != nullptr)
             m_RadarScene->removeItem(*m_line);
         m_line = line; // add QLine* m_line = nullptr; in your class    
         m_RadarScene->addLine(*line, mainline);
       }

答案 1 :(得分:1)

使用valueChanged信号,将setMaximun值设置为359,并在行的开头设置setTransformOriginPoint。 在标题中:

private:
    ...
    QGraphicsScene *m_RadarScene;
    QLineF line;
    QGraphicsLineItem *item;
public slots:
    void drawMainLine(int angle);

在构造函数中:

connect(ui->m_QDial_rotation, &QDial::valueChanged, this, &Radar::drawMainLine);
ui->m_QDial_rotation->setMaximum(359);
QPointF mCenter = QPointF(ui->graphicsView->size().width()/2, ui->graphicsView->size().height()/2);
int radius = 50;
ui->graphicsView->centerOn(mCenter);
line = QLineF(mCenter, mCenter + QPointF(0, radius) );

item = m_RadarScene->addLine(line, mainline);
item->setTransformOriginPoint(mCenter);

onSlot:

void Radar::drawMainLine(int angle)
{
    qDebug()<<angle;
    item->setRotation(angle);
}