要判斷鼠標是否在由QPainterPath
或一系列QPointF
點定義的多邊形的線條上,你可以使用以下步驟:
-
獲取鼠標當前位置:在鼠標事件中,使用
QMouseEvent
的pos()
方法獲取鼠標的當前位置。 -
檢查點與線段的距離:遍歷多邊形的每條線段,使用點到線段距離的公式計算鼠標位置到每條線段的距離。
-
比較距離與閾值:如果距離小于某個閾值(例如像素單位的5或10),則可以認為鼠標位于線條上。
#include <QMouseEvent> #include <QVector> #include <QPointF> #include <QDebug>// ...// 假設你有一個成員變量或局部變量rectPoints QVector<QPointF> rectPoint; rectPoint << QPointF(50, 50) << QPointF(150, 50)<< QPointF(150, 150) << QPointF(50, 150);// 在你的控件的鼠標事件處理函數中 void MyWidget::mousePressEvent(QMouseEvent *event) {QPointF mousePos = event->localPos(); // 獲取鼠標在控件內的位置double threshold = 5.0; // 設置一個閾值,根據具體情況調整if (isMouseOnPolyline(mousePos, rectPoints, threshold)) {qDebug() << "Mouse is on the polyline";// 鼠標在多邊形線條上的處理邏輯} else {qDebug() << "Mouse is not on the polyline";// 鼠標不在多邊形線條上的處理邏輯} }// 輔助函數:計算點到線段的距離 double pointToLineDistance(const QPointF &p, const QPointF &p1, const QPointF &p2) {double dx = p2.x() - p1.x();double dy = p2.y() - p1.y();if (qFuzzyIsNull(dx) && qFuzzyIsNull(dy)) {return qAbs(p.x() - p1.x());}double t = ((p.x() - p1.x()) * dx + (p.y() - p1.y()) * dy) / (dx * dx + dy * dy);t = qBound(0.0, t, 1.0);QPointF nearestPoint = p1 + t * (p2 - p1);return (p - nearestPoint).manhattanLength(); }// 檢查鼠標點擊是否在多邊形線條上 bool isMouseOnPolyline(const QPointF &mousePos, const QVector<QPointF> &points, double threshold) {QPointF currentPoint = points.last(); // 從最后一個點開始foreach (const QPointF &nextPoint, points) {if (pointToLineDistance(mousePos, currentPoint, nextPoint) < threshold) {return true;}currentPoint = nextPoint;}return false; // 如果沒有找到,則返回false }
在這個示例中,
pointToLineDistance
函數計算了給定點到線段的最近點的距離。isMouseOnPolyline
函數遍歷多邊形的所有線段,并使用pointToLineDistance
函數檢查鼠標位置是否在指定的閾值內。如果是,則可以認為鼠標位于線條上。請注意,閾值(
threshold
)是一個敏感度參數,你可以根據實際需要調整這個值。此外,mousePos
是鼠標事件提供的當前鼠標位置,rectPoints
是多邊形頂點的數組。在實際使用中,你需要將這些變量替換為你的具體值。