This way it seems to work:
DynamicModule[{pt1 = {0.8, qgHSZ[0.2] }, pt2 = {0.6, qgHSZ[0.5] },
pt3 = {0.3, qgHSZ[0.25] }, from = .2 , x},
Dynamic@Show[
ListStepPlot[ {pt1 , pt2 , pt3} , Axes -> False],
Graphics[{Line[{{from , pt1[[2]]}, pt1}],
LightBlue , {Opacity[0.01], EdgeForm[Thin], poly},
l1 =
Locator[Dynamic[
pt1, (pt1 = RegionNearest[poly, #];
from = If[pt1[[2]] > 4.55,
x /. NSolve[qgHSZ[x] == pt1[[2]], x][[1]], 0.]) & ]],
l2 = Locator[Dynamic[pt2, (pt2 = RegionNearest[poly, #]) &]],
l3 = Locator[Dynamic[pt3, (pt3 = RegionNearest[poly, #]) &]],
Red, Text["P1", pt1, 2 {1, 1}]}],
Axes -> True, AxesOrigin -> {0, 0}, AspectRatio -> 1 ,
PlotRange -> CoordinateBounds[poly],
PlotRangePadding -> Scaled[.05], Ticks -> Automatic]]