Russian Qt Forum
Сентябрь 30, 2024, 22:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Перемещение QFrame  (Прочитано 10801 раз)
spectre71
Гость
« Ответ #15 : Июль 24, 2009, 16:39 »

void VFFrame::mouseMoveEvent(QMouseEvent* events)
{
   QFrame::mouseMoveEvent(events);
        QPoint gpos= events->globalPos ().
        QPoint pos = GraphicDisplay->mapFromGlobal(gpos) ;
// pos - mouse pos in GraphicDisplay
   emit moveVF();
 
   if(!_is_left_pressed) return;
   if(_vf_shape == QFrame::VLine)
      setGeometry(_move_point.x(), y(), width(), height());
   else if(_vf_shape == QFrame::HLine)
      setGeometry(x(), _move_point.y(), width(), height());
}

pos - mouse позиция относительно GraphicDisplay. Далее делай с ней что хочешь
Записан
AD
Гость
« Ответ #16 : Июль 24, 2009, 16:50 »

Спасибо.
Записан
AD
Гость
« Ответ #17 : Июль 24, 2009, 17:50 »

Подсказанное решение практически полностью подходит. Ни слоты не нужны, ничего. СПАСИБО ОГРОМНОЕ!!!

Единственное, все-таки курсор идет слегка левее визира. Но основная проблема, по сути, решена. Есть ли возможность попасть ровно под курсор?
Записан
AD
Гость
« Ответ #18 : Июль 27, 2009, 10:16 »

Сделал вариант, который "почти" правильный! Улыбающийся

Код
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. А есть возможность сделать без таких хаков? Заранее благодарен.
Записан
BRE
Гость
« Ответ #19 : Июль 27, 2009, 10:18 »

Это "почти" состоит в том, что я из координаты вычитаю константу. У меня она равна 20. А есть возможность сделать без таких хаков? Заранее благодарен.
http://www.forum.crossplatform.ru/index.php?showtopic=3093&view=findpost&p=22694
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.175 секунд. Запросов: 20.