PDA

View Full Version : EventFilter - MoveMouse event changes position every pixel



Grzyboo
1st August 2015, 22:44
I'm making some draggable widgets. Labels work fine any way I do it, but there is obviously a problem with PlainTextEdits. I've installed an EventFilter on PlainTextEdit's viewport and want to drag the whole widget with mouse movement.



bool FilerPlainText2Click::eventFilter(QObject* object, QEvent* event)
{
if(event->type() == QEvent::MouseButtonDblClick)
//some code here (set pSelectedWidget)
else if(event->type() == QEvent::MouseButtonPress && ((QMouseEvent*)event)->button() == Qt::LeftButton)
//some code here (set bDragging true)
else if(event->type() == QEvent::MouseMove)
{
QWidget* pSelected = ((QWidget*)object)->parentWidget(); // pointer to the whole widget
MainWindow* pWin = (MainWindow*)pSelected->window(); // pointer to the main window, which this widget is placed in

if(pWin->bDragging)
{
QMouseEvent* mEvent = (QMouseEvent*)event;
int x = mEvent->x() - pWin->iDraggingDistX;
int y = mEvent->y() - pWin->iDraggingDistY;
QRect rect(x, y, pWin->pSelectedWidget->width(), pWin->pSelectedWidget->height());
pWin->pSelectedWidget->setGeometry(rect);

qDebug() << "mEvent pos: " << mEvent->x() << " | " << mEvent->y();
}
return true;
}
else
return QObject::eventFilter(object,event);
}

Explanation:


iDraggingDistX / iDraggingDistY - distance between grabbed point and left top corner of the widget
pSelectedWidget - the widget we're dragging


qDebug's effect:


mEvent pos: 217 | 462
mEvent pos: 127 | 62
mEvent pos: 216 | 462
mEvent pos: 126 | 62
mEvent pos: 216 | 463
mEvent pos: 125 | 62
mEvent pos: 215 | 463
mEvent pos: 124 | 62
mEvent pos: 215 | 464
mEvent pos: 123 | 62

For some reason every time i move my widget by 1 pixel, mEvent's coordinates change (they seem to be realtive to widget once and relative to main window second time). My widget is obviously blinking in both positions. Why is this?
I realise it may sound very confusing and i might not be clear enough. Adding a video for clarity.


https://www.youtube.com/watch?v=DqeNngwCNMg&feature=youtu.be

anda_skoa
2nd August 2015, 12:01
You could try to map the coordinates to global coordinates and do the distance calculation in that domain.

Cheers,
_

Grzyboo
2nd August 2015, 18:28
Thanks a lot! It helped.