C++ 将线的一端定位在QT中的圆上
所以我需要重建一个雷达式的效果。我的线条的一点在屏幕的中心,另一点延伸到雷达屏幕的边缘 我想用QDial来控制直线第二点的位置 我只是不确定我需要用什么数学方法来保持第二个点被锁定,也就是说,当QDial移动它时,在屏幕边缘 提前谢谢 [新增信息] 下面是我如何将线条添加到场景中的。将线的角度与我的QDial绑定在一起可以完美地处理所有的数学问题,但它会随着刻度盘的每一圈而使另一条线超调,而不仅仅是调整一条线的角度C++ 将线的一端定位在QT中的圆上,c++,qt,qt5,C++,Qt,Qt5,所以我需要重建一个雷达式的效果。我的线条的一点在屏幕的中心,另一点延伸到雷达屏幕的边缘 我想用QDial来控制直线第二点的位置 我只是不确定我需要用什么数学方法来保持第二个点被锁定,也就是说,当QDial移动它时,在屏幕边缘 提前谢谢 [新增信息] 下面是我如何将线条添加到场景中的。将线的角度与我的QDial绑定在一起可以完美地处理所有的数学问题,但它会随着刻度盘的每一圈而使另一条线超调,而不仅仅是调整一条线的角度 void Radar::drawMainLine(){ QPainte
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);
}
如何调整单线的角度
我知道我应该能够只影响线的一个端点的位置,但我认为这将使我回到需要算法来处理其位置的路径上。例如,您可以在QLine上创建一个名为m_line的指针。这个指针将包含当前行,一旦你想移动该行,你可以做一个removietem(我想你的雷达是一个qgraphicscene),然后添加新行。 就像这样:
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);
}
例如,您可以在QLine上创建一个名为m_line的指针。这个指针将包含当前行,一旦你想移动该行,你可以做一个removietem(我想你的雷达是一个qgraphicscene),然后添加新行。 就像这样:
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);
}
使用
valueChanged
信号,将maximun值设置为359,并将TransformOriginPoint设置在线路的起点。
在标题中:
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);
现场:
void Radar::drawMainLine(int angle)
{
qDebug()<<angle;
item->setRotation(angle);
}
void雷达::绘图主线(内角)
{
qDebug()使用valueChanged
signal,将maximun value设置为359,并将transformoriginpoint设置在行首。
在标题中:
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);
现场:
void Radar::drawMainLine(int angle)
{
qDebug()<<angle;
item->setRotation(angle);
}
void雷达::绘图主线(内角)
{
qDebug()我甚至不知道从哪里开始翻译这些东西我甚至不知道从哪里开始翻译这些东西Rafael我甚至不知道从哪里开始翻译这些东西Rafael我甚至不知道从哪里开始翻译这些东西谢谢,它在removeItem上出错,还有addItem:没有匹配的调用来删除或添加指针。这对addItem有效,但是我还是不喜欢removeItem。我选择了另一个答案作为解决方案,因为当你帮助我解决这个问题时,我发现使用LineItem是一个更好的方法。非常感谢你,removeItem上出现了很多错误,还有,addItem:没有匹配的调用来删除或添加指针e addItem,但它仍然不喜欢删除它。我选择了另一个答案作为解决方案,因为当你帮助我解决这个问题时,我发现使用行项目是一种更好的方法。谢谢你,尽管非常感谢你将此作为答案,因为我觉得它增加了一种比t更正确的方法o我是如何处理它的。谢谢。包括这个作为答案,因为我觉得它比我如何处理它添加了一个更正确的方法。谢谢。