QGraphicsItem以点为中心画五角星 C++
时间: 2024-01-24 12:44:48 浏览: 74
qgraphics.zip
以下是以点为中心画五角星的示例代码:
```cpp
#include <QGraphicsItem>
#include <QPainter>
class StarItem : public QGraphicsItem
{
public:
StarItem(QPointF center, qreal radius, QColor color, QGraphicsItem *parent = nullptr)
: QGraphicsItem(parent), m_center(center), m_radius(radius), m_color(color)
{
}
QRectF boundingRect() const override
{
return QRectF(m_center.x() - m_radius, m_center.y() - m_radius, m_radius * 2, m_radius * 2);
}
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = nullptr) override
{
painter->setPen(Qt::NoPen);
painter->setBrush(m_color);
const int sides = 5;
const qreal angle = 2 * M_PI / sides;
const qreal outerRadius = m_radius;
const qreal innerRadius = m_radius / 2;
QPainterPath path;
QPointF startPoint = QPointF(m_center.x() + outerRadius, m_center.y());
path.moveTo(startPoint);
for (int i = 1; i < sides; ++i) {
QPointF outerPoint = QPointF(m_center.x() + outerRadius * std::cos(i * angle),
m_center.y() + outerRadius * std::sin(i * angle));
path.lineTo(outerPoint);
QPointF innerPoint = QPointF(m_center.x() + innerRadius * std::cos((i + 0.5) * angle),
m_center.y() + innerRadius * std::sin((i + 0.5) * angle));
path.lineTo(innerPoint);
}
path.lineTo(startPoint);
painter->drawPath(path);
}
private:
QPointF m_center;
qreal m_radius;
QColor m_color;
};
```
在上述代码中,我们使用了 `QGraphicsItem` 作为基类,实现了 `boundingRect()` 和 `paint()` 函数。
`boundingRect()` 函数用于返回图元的边界矩形。在本例中,我们以点为中心,将半径 `m_radius` 确定为图元的大小。
`paint()` 函数用于绘制图元。我们使用 `QPainterPath` 类来绘制五角星的路径,并使用 `QPainter` 类来填充路径。具体绘制五角星的方法是:先计算出五个外角点和五个内角点的坐标,并将它们依次连接起来。
在 `main.cpp` 中,我们可以这样创建一个五角星并将其添加到场景中:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
QGraphicsView view(&scene);
StarItem *star = new StarItem(QPointF(150, 150), 50, Qt::yellow);
scene.addItem(star);
view.show();
return a.exec();
}
```
这样就可以在窗口中看到一个以点为中心的黄色五角星了。
阅读全文