Сделал вариант, который "почти" правильный!
C++ (Qt)
/// Переопределение нажатия на лекую кнопку мыши
void VFFrame::mousePressEvent(QMouseEvent* events)
{
QFrame::mousePressEvent(events);
switch(events -> button())
{
case Qt::LeftButton: ///< если нажата левая кнопка мыши
_is_left_pressed = true;
break;
}
if(!_is_left_pressed) return;
QPoint gpos(events -> globalPos());
QPoint pos((_graph) ? _graph -> mapFromGlobal(gpos) : ((_mgraph) ? _mgraph -> mapFromGlobal(gpos) : gpos));
if(_vf_shape == QFrame::VLine)
pos.setX(pos.x() - _DELTA_COORD),
setGeometry(pos.x(), y(), width(), height());
else if(_vf_shape == QFrame::HLine)
pos.setY(pos.y() - _DELTA_COORD),
setGeometry(x(), pos.y(), width(), height());
}
/// Передвижение визира вслед за мышью
void VFFrame::mouseMoveEvent(QMouseEvent* events)
{
QFrame::mouseMoveEvent(events);
if(!_is_left_pressed) return;
QPoint gpos(events -> globalPos());
QPoint pos((_graph) ? _graph -> mapFromGlobal(gpos) : ((_mgraph) ? _mgraph -> mapFromGlobal(gpos) : gpos));
if(_vf_shape == QFrame::VLine)
pos.setX(pos.x() - _DELTA_COORD),
setGeometry(pos.x(), y(), width(), height());
else if(_vf_shape == QFrame::HLine)
pos.setY(pos.y() - _DELTA_COORD),
setGeometry(x(), pos.y(), width(), height());
}
/// Отпускание кнопки мыши
void VFFrame::mouseReleaseEvent(QMouseEvent* events)
{
QFrame::mouseReleaseEvent(events);
if(!_is_left_pressed) return;
_is_left_pressed = false;
QPoint gpos(events -> globalPos());
QPoint pos((_graph) ? _graph -> mapFromGlobal(gpos) : ((_mgraph) ? _mgraph -> mapFromGlobal(gpos) : gpos));
if(_vf_shape == QFrame::VLine)
pos.setX(pos.x() - _DELTA_COORD),
setGeometry(pos.x(), y(), width(), height());
else if(_vf_shape == QFrame::HLine)
pos.setY(pos.y() - _DELTA_COORD),
setGeometry(x(), pos.y(), width(), height());
_is_viewfinder = false;
}
Это "почти" состоит в том, что я из координаты вычитаю константу. У меня она равна 20. А есть возможность сделать без таких хаков? Заранее благодарен.