qt qgraphicsview 根据两点坐标和弧度画圆弧
时间: 2023-11-12 10:05:02 浏览: 188
Qt QGraphicsView 控件实现标尺和刻度先效果
要在 Qt 的 QGraphicsView 中画圆弧,可以使用 QGraphicsPathItem 和 QPainterPath 类。下面是一个示例代码,根据两点坐标和弧度画圆弧:
```cpp
#include <math.h>
#include <QPointF>
#include <QPainterPath>
#include <QGraphicsPathItem>
class ArcItem : public QGraphicsPathItem
{
public:
ArcItem(QPointF start, QPointF end, double angle, QGraphicsItem* parent = nullptr)
: QGraphicsPathItem(parent), m_start(start), m_end(end), m_angle(angle)
{
drawArc();
}
private:
void drawArc()
{
QPainterPath path;
QPointF center = getCenter();
qreal radius = getRadius();
qreal startAngle = getStartAngle();
qreal endAngle = getEndAngle();
path.arcTo(center.x() - radius, center.y() - radius, radius * 2, radius * 2, startAngle, endAngle);
setPath(path);
}
QPointF getCenter() const
{
qreal x = (m_start.x() + m_end.x()) / 2;
qreal y = (m_start.y() + m_end.y()) / 2;
return QPointF(x, y);
}
qreal getRadius() const
{
qreal dx = m_start.x() - m_end.x();
qreal dy = m_start.y() - m_end.y();
return sqrt(dx * dx + dy * dy) / 2;
}
qreal getStartAngle() const
{
qreal dx = m_start.x() - getCenter().x();
qreal dy = m_start.y() - getCenter().y();
qreal angle = atan2(dy, dx) * 180 / M_PI;
return angle;
}
qreal getEndAngle() const
{
return m_angle * 180 / M_PI;
}
private:
QPointF m_start;
QPointF m_end;
double m_angle;
};
```
其中,start 和 end 分别是圆弧的起点和终点,angle 是圆弧的弧度。在构造函数中,我们调用 drawArc 方法画出圆弧,它使用 QPainterPath 类来构造圆弧路径。getCenter、getRadius、getStartAngle 和 getEndAngle 方法分别计算圆弧的圆心、半径、起始角度和结束角度。
使用 ArcItem 类时,可以这样调用:
```cpp
QPointF start(0, 0);
QPointF end(100, 0);
double angle = M_PI / 2;
ArcItem* arcItem = new ArcItem(start, end, angle);
scene->addItem(arcItem);
```
这样就可以在 QGraphicsScene 上画出一个起点为 (0, 0)、终点为 (100, 0)、弧度为 pi / 2 的圆弧了。
阅读全文