Qt 射击靶环判断9环12点 方向的代码示例
时间: 2023-09-08 10:16:46 浏览: 92
下面是一个简单的Qt代码示例,演示如何实现靶环的绘制和命中判断,以及如何在靶环上标记12点方向:
```cpp
#include <QtWidgets>
#include <cmath>
// 自定义 QGraphicsItem 类,表示靶环
class TargetItem : public QGraphicsItem
{
public:
TargetItem(const QRectF& rect, QGraphicsItem* parent = nullptr)
: QGraphicsItem(parent)
, m_rect(rect)
, m_hit(false)
{}
// 重写 boundingRect 函数,返回靶环的边界矩形
QRectF boundingRect() const override
{
return m_rect;
}
// 重写 paint 函数,绘制靶环和标记12点方向
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
// 绘制靶环
if (m_hit) {
painter->setBrush(Qt::red);
} else {
painter->setBrush(Qt::white);
}
painter->drawRect(m_rect);
// 绘制标记
QPointF center = m_rect.center();
QPointF point = center + QPointF(0, -m_rect.width() / 2);
point = mapFromScene(point);
qreal angle = std::atan2(m_rect.width() / 2, m_rect.height()) * 180.0 / M_PI;
painter->save();
painter->translate(point);
painter->rotate(angle);
painter->drawEllipse(QPointF(0, 0), 5, 5);
painter->restore();
}
// 重写 mousePressEvent 函数,处理鼠标点击事件
void mousePressEvent(QGraphicsSceneMouseEvent* event) override
{
QPointF pos = event->pos();
if (m_rect.contains(pos)) {
m_hit = true;
update();
}
QGraphicsItem::mousePressEvent(event);
}
private:
QRectF m_rect; // 靶环的边界矩形
bool m_hit; // 是否命中靶环
};
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
// 创建 QGraphicsView 对象
QGraphicsView view;
view.setWindowTitle("Target Shooting");
view.setRenderHint(QPainter::Antialiasing);
view.setDragMode(QGraphicsView::ScrollHandDrag);
view.setOptimizationFlag(QGraphicsView::DontAdjustForAntialiasing);
view.setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// 创建 QGraphicsScene 对象,并设置场景范围
QGraphicsScene scene;
scene.setSceneRect(0, 0, 800, 600);
view.setScene(&scene);
// 创建 TargetItem 对象,并添加到场景中
QRectF rect(0, 0, 200, 200);
TargetItem* target = new TargetItem(rect);
target->setPos(300, 200);
scene.addItem(target);
// 显示 QGraphicsView 对象
view.show();
return app.exec();
}
```
在这个示例中,我们首先创建了一个QGraphicsView对象,并将其设置为不显示水平和垂直滚动条,以便实现更加平滑的拖拽效果。然后,我们创建了一个QGraphicsScene对象,并将其设置为场景范围为800x600。接着,我们创建了一个TargetItem对象,表示靶环,并将其添加到场景中。在TargetItem的构造函数中,我们传入一个QRectF对象表示靶环的边界矩形。
在TargetItem中,我们重写了boundingRect函数和paint函数。在boundingRect函数中,我们返回了靶环的边界矩形。在paint函数中,我们首先根据命中情况设置画刷的颜色,然后使用QPainter的drawRect函数绘制靶环。接着,我们计算出12点方向的坐标,并将其转换为相对于QGraphicsItem的本地坐标系。最后,我们使用QPainter的save和restore函数保存和恢复画笔状态,以便在绘制小圆形时进行相应的偏移和旋转。
最后,在TargetItem中,我们还重写了mousePressEvent函数,以便处理鼠标点击事件。在这个函数中,我们首先获取鼠标点击的位置,然后判断该位置是否在靶环内。如果在靶环内,则将命中标志设置为true,并调用update函数更新绘图。
阅读全文