QGraphicsItem绘制可移动的同心圆弧C++
时间: 2023-11-23 18:07:00 浏览: 29
您可以重写QGraphicsItem的paint()方法,在其中使用QPainter绘制同心圆弧。
以下是一个简单的示例代码,它会在一个QGraphicsScene中绘制5个同心圆弧:
```cpp
#include <QGraphicsItem>
#include <QPainter>
class ArcItem : public QGraphicsItem
{
public:
ArcItem(qreal radius, qreal thickness, qreal startAngle, qreal spanAngle, QGraphicsItem *parent = nullptr)
: QGraphicsItem(parent), m_radius(radius), m_thickness(thickness), m_startAngle(startAngle), m_spanAngle(spanAngle) {}
QRectF boundingRect() const override
{
qreal penWidth = 1;
return QRectF(-m_radius - m_thickness / 2 - penWidth / 2, -m_radius - m_thickness / 2 - penWidth / 2,
2 * (m_radius + m_thickness / 2 + penWidth / 2), 2 * (m_radius + m_thickness / 2 + penWidth / 2));
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) override
{
painter->setRenderHint(QPainter::Antialiasing);
QPen pen;
pen.setWidthF(m_thickness);
pen.setColor(QColor(0, 0, 255));
painter->setPen(pen);
qreal startAngle = m_startAngle * 16;
qreal spanAngle = m_spanAngle * 16;
painter->drawArc(QRectF(-m_radius, -m_radius, 2 * m_radius, 2 * m_radius), startAngle, spanAngle);
}
private:
qreal m_radius;
qreal m_thickness;
qreal m_startAngle;
qreal m_spanAngle;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(-200, -200, 400, 400);
const int arcCount = 5;
const qreal radiusStep = 40;
const qreal thickness = 10;
const qreal startAngle = 30;
const qreal spanAngle = 120;
for (int i = 0; i < arcCount; ++i)
{
qreal radius = (i + 1) * radiusStep;
ArcItem *arc = new ArcItem(radius, thickness, startAngle, spanAngle);
arc->setPos(0, 0);
scene.addItem(arc);
}
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.show();
return app.exec();
}
```
在这个示例中,我们定义了一个ArcItem类,继承自QGraphicsItem,它可以绘制一个同心圆弧。在paint()方法中,我们首先设置了绘制参数,然后使用QPainter的drawArc()方法绘制同心圆弧。在boundingRect()方法中,我们返回了绘制区域的矩形边界。
在main()函数中,我们创建了一个QGraphicsScene,并向其中添加了5个ArcItem对象,分别在不同的半径上绘制同心圆弧。最后,我们创建了一个QGraphicsView并显示了场景。